2016-04-13 7 views
0

Ich versuche, Objekte aus der Datenbank basierend auf einer Liste von IDs zu bekommen, aber ich bekomme den Fehler EF erkennt die Methode 'Boolean Contains (System.Object)' nicht, und diese Methode kann nicht in einen Ausdruck übersetzt werden

LINQ to Entities nicht das Verfahren erkennen 'Boolean Enthält (System.Object)' Methode, und diese Methode kann nicht in einen Laden Ausdruck

hier übersetzt ist mein Code

 shopingEntities db = new shopingEntities(); 
     var q = (from a in db.CatSetups 
        join b in db.CatofCats 
        on a.CatId equals b.ParentCatID 
        where a.CatId == 1 

        select new 
        { 



       // ID  b.ChildCat 




        }); 

     ArrayList list = new ArrayList(q.ToList()); 
     var ok = (from cc in db.CatSetups 
       where list.Contains(cc.CatId) 
       select cc).ToList(); 
+1

Nach dem aktuellen Code ist q ein leerer anonymer Typ? –

+0

Welche Eigenschaft wählen Sie in Ihrer ersten Abfrage aus? – octavioccl

+0

Ich würde dringend empfehlen, dass Sie aufhören, 'ArrayList' zu verwenden. Wenn Sie nicht mit Bibliotheken in Kontakt kommen, die viele Jahre alt sind, sollte das nicht nötig sein. Selbst dann würde ich "List" überall sonst verwenden und einfach zu diesem Zweck in eine 'ArrayList' kopieren. –

Antwort

0

Wenn ich gut Ihr Problem verstanden, Sie versuchen, Kind Kategorien für eine bestimmte Kategorie Id

var childCats=from a in db.CatSetups 
       join b in db.CatofCats on a.CatId equals b.ParentCatID 
       where a.CatId == 1 
       select b.ChildCat;//Assuming ChildCat is an integer 

var cats=db.CatSetups.Where(c=>childCats.Contains(c.CatId)).ToList(); 

Falls zu finden, dass CatofCats die Verknüpfungstabelle in einer viele zu viele Beziehung ist, und wenn Sie Navigationseigenschaften verwendet wurden:

public class CatofCats 
{ 
    public int ParentCatID{get;set;} 

    public int ChildCatID{get;set;} 

    public virtual CatSetups ParentCat{get;set;} 
    public virtual CatSetups ChildCat{get;set;} 
} 

Dann würde Ihre Frage sein:

var childCats=db.CatofCats.Where(c=>c.ParentCatID==1).Select(c=>ChildCat); 
+0

Es funktioniert! Vielen Dank octavioccl :) Ich bin eigentlich neu bei Linq. Ich dachte, Array von IDs wie Int [] Ids wäre viel leichter als Var Ids .... Ist Var-Liste verwenden würde Licht sein, wie Sie Arrary von Int für IDs verwenden – Lucia

0

Es gibt einfach keine Übersetzung für ArrayList.Contains. Aber Sie müssen es nicht so machen. Verwenden Sie einfach:

var q = from a in db.CatSetups 
     join b in db.CatofCats 
     on a.CatId equals b.ParentCatID 
     where a.CatId == 1 
     select b.ChildCat; 

var list = q.ToList(); 

Nun, wenn Sie Contains verwenden, löst es zu Enumerable.Contains<T>, für die EF verfügt über einen integrierten Übersetzungspfad. Nur wenn T ein primitiver Typ ist. Wählen Sie deshalb keinen anonymen Typ.

+0

Angenommen, dass "B.ChildCat" ist eine ganze Zahl. Vielleicht sollte es so etwas wie 'b.ChildCat.CatId' oder' b.ChildCatId' sein. –

0

Ersetzen

ArrayList list = new ArrayList(q.ToList()); 

mit

var list = q.ToList(); 

Die Contains Methode aus der nicht-generischen ArrayList ist in EF nicht implementiert. Enumerable.Contains ist definitiv.

0

Es hat mit der Tatsache zu tun, dass Sie ArrayList verwenden Sie können nicht einfach tun:

`

var list = q.ToList() 

var ok = (from cc in db.CatSetups 
       where list.Contains(cc.CatId) 
       select cc).ToList(); 

`

ich kein EF-Experte bin, aber ich vermute, das enthält nur unterstützt generische Sammlungen

Verwandte Themen