2009-01-24 13 views
10

Ich bin ein etwas erfahrener Rails-Entwickler und ich dachte, ich würde ASP.NET-Version von MVC ausprobieren. Dabei entschied ich mich auch, Linq-> SQL ...Linq To Sql Viele-viele Join Tabelle

Ich bin ein bisschen verwirrt über die Art, wie Linq-> Sql verbindet Joins.

Ein triviales Beispiel meines Schema ist:

Bücher:
id
Titel

Kategorien:
id
Name

books_categories:
book_id

category_id

einfach diese Tabellen in die .dbml Datei ziehen scheint nicht, es zu tun. Ich bekomme eine Eigenschaft auf meiner Buchklasse books_categories, was ich erwarte, ist eine Eigenschaft, über die ich iterieren und Klassenklassen direkt erhalten kann.

Gerade jetzt muss ich etwas tun, das

 foreach (books_categories bc in book.books_categories) 
     { 
      category_names.Add(bc.Category.category.Trim()); 
     } 

[In Antwort auf akzeptierte Antwort] sehr falsch anfühlt
ich zähneknirschend die Antwort „geben Sie Ihren eigenen Glue Code“ akzeptiert. Nachdem ich meine Untersuchungen von Linq-> Sql fortgeführt hatte, entdeckte ich, dass es anscheinend langsam zugunsten des (mehr kraftvollen, IMO) Entity Framework losgelassen wird. EF erlaubt es immer noch, LINQ für Abfragen zu verwenden, und macht eine anständige Aufgabe, Beziehungen wie Rubys ActiveRecord herauszufinden.

Antwort

8

Verwenden Sie eine Teilklassenimplementierung für Buch und geeignete Methoden für die Klassen und ihre Eigenschaften hinzufügen. Lassen Sie die Eigenschaften die Eigenschaft Books_Categories als Front-End verwenden (Sie können dies durch eine private Sichtbarkeit erzwingen, um die Implementierung über Ihre Categories-Eigenschaft zu erzwingen).

Offensichtlich müssen Sie einige Fehler/Begrenzungsüberprüfung, etc. hinzufügen, aber Sie erhalten die Idee.

Ich gebe dir das ist nicht ideal, aber zumindest haben Sie die Flexibilität zu bestimmen, wie es funktioniert.

+0

wouldn‘ • Sie können nur eine Book_Category zu this.Book_Categories hinzufügen und entfernen? –

+0

Edit error - Ich habe wahrscheinlich den Code eingegeben und dann die Eigenschaft umbenannt. Werde Dich auf dem Laufenden halten. – tvanfosson

0

Ich glaube nicht, dass Ihr erwartetes Ergebnis in Linq zu Sql unterstützt wird.

Was Sie tun, kann sich falsch anfühlen, aber ich denke, das ist eine Möglichkeit, um diese Einschränkung von L2S zu umgehen.

Mann, ich habe wirklich in Rails zu bekommen ...

2

Viele bis viele Zuordnungen werden im Entity Framework explizit unterstützt, nicht jedoch in LINQ to SQL. Sie können auch ORMs von Drittanbietern wie NHibernate verwenden.

+0

Das lässt mich fragen, warum ich Linq-> Sql über Ado.NET + Linq verwenden würde. Ich dachte mir, Linq-> Sql würde ORM unterstützen, tut das nicht, fühlt sich wie ein Schritt zurück an. – Bill

+1

LINQ to SQL * ist * ein ORM (von Art). Sie verwenden LINQ to SQL nicht mit einem * anderen * ORM. Andere ORMs ersetzen es. Andere ORMs können LINQ unterstützen oder auch nicht, aber die meisten unterstützen es. –

+0

Wenn Linq-Sql ein ORM ist, dann würde ich erwarten, dass es herausfindet, wie Joins automatisch ausgeführt werden (daher der relationale Teil), anstatt sie selbst schreiben zu müssen .... – Bill

0

Was Sie tun können, wenn Sie ein Buch erstellen möchten und wollen direkt eine Kategorie, um es hinzuzufügen ist: Ihrer Ansicht:

 <p> 
      <label for="CategorySelect">Category:</label> 
      <%= Html.ListBox("CategorySelect") %> 
      <%= Html.ValidationMessage("CategorySelect", "*")%> 
     </p> 

in Ihrem bookscontroller:

 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();