.net - multiple - Linq to Sql Many-Many se unen a la tabla
linq join multiple conditions (4)
No creo que el resultado esperado sea compatible con Linq a Sql.
Lo que estás haciendo puede parecer un error, pero creo que esa es una forma de evitar esa limitación de L2S.
Hombre, realmente tengo que entrar en Rails ...
Soy un experimentado desarrollador de Rails y pensé que probaría la versión de MVC de ASP.NET. Al hacerlo, también decidí probar Linq-> Sql ...
Estoy un poco confundido sobre la forma en que Linq-> Sql maneja las uniones.
Un ejemplo trivial de mi esquema es:
libros :
carné de identidad
título
categorías :
carné de identidad
nombre
books_categories :
book_id
categoria ID
Simplemente arrastrando estas tablas al archivo .dbml no parece hacerlo. Obtengo una propiedad en mi clase de libros books_categories, lo que espero es una propiedad que pueda iterar y obtener clases de Categoría directamente.
Ahora mismo tengo que hacer algo que me parece muy mal
foreach (books_categories bc in book.books_categories)
{
category_names.Add(bc.Category.category.Trim());
}
[En respuesta a la respuesta aceptada]
A regañadientes acepté la respuesta de "escribe tu propio código de pegamento". Después de continuar mi investigación de Linq-> Sql, descubrí que, al parecer, se está abandonando lentamente a favor del Marco de Entidades (más poderoso, IMO). EF todavía permite usar LINQ para consultas y hace un trabajo decente al descifrar relaciones como ActiveRecord de Ruby.
Muchos a muchos mapeos son explícitamente compatibles en Entity Framework, pero no en LINQ to SQL. También puede usar ORM de terceros como NHibernate.
Utilice una implementación de clase parcial para el Libro y agregue los métodos apropiados para las categorías y sus propiedades. Haga que las propiedades estén en la propiedad de Books_Categories (puede hacer que esto tenga visibilidad privada para forzar la implementación a través de su propiedad de Categorías).
public partial class Books
{
public IEnumerable<string> CategoryNames
{
get
{
return this.Books_Categories
.Select( bc => bc.Category.category.Trim() );
}
}
public void AddCategory( Category category )
{
this.Books_Categories.Add( new Book_Category
{
Category = category,
Book = this
} );
}
public void RemoveCategory( Category category )
{
var bc = this.Book_Categories
.Where( c => c.Category == category )
.SingleOrDefault();
this.Books_Categories.Remove( bc );
}
}
Obviamente, deberá agregar alguna comprobación de errores / límites, etc. pero se entiende la idea.
Te concederé que esto no es lo ideal, pero al menos tienes la flexibilidad para determinar cómo funciona.
Lo que puede hacer si quiere crear un libro y directamente desea agregar una categoría es: en su vista:
<p>
<label for="CategorySelect">Category:</label>
<%= Html.ListBox("CategorySelect") %>
<%= Html.ValidationMessage("CategorySelect", "*")%>
</p>
en su controlador de libros:
public ActionResult New()
{
var data = _entities.Categories.ToList();
ViewData["CategorySelect"] = new MultiSelectList(data, "Id", "Name");
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult New([Bind(Exclude = "Id")] Book Booknew)
{
IEnumerable<int> selectedCategories = Request["CategorySelect"].Split(new Char[] { '','' }).Select(idStr => int.Parse(idStr));
if (!ModelState.IsValid)
return View();
try {
foreach(var item in selectedCategories){
BooksCategories bc = new BooksCategories();
bc.Book = Booknew;
bc.CategoryId = item;
_entities.BooksCategories.InsertOnSubmit(bc);
}
_entities.Books.InsertOnSubmit(Booknew);
_entities.SubmitChanges();