Typ member Unterstützung für LINQ-to-Entities?

Ich habe eine MVC3-Projekt mit Entity Framework-Modell, in denen ich markiert eine Klasse wie folgt aus:

public partial class Product
{
    public bool IsShipped
    {
        get { /* do stuff */ }
    }
}

sind und welche ich verwenden möchte in einem LINQ-Ausdruck:

db.Products.Where(x => x.IsShipped).Select(...);

jedoch bekomme ich die folgende Fehlermeldung:

System.NotSupportedException wurde unhandled by user code Message=Die
angegeben Typ member 'IsShipped' wird nicht unterstützt LINQ to Entities.
Nur Initialisierungen, die juristische Mitglieder und entity navigation Eigenschaften
unterstützt werden. Source=System.Daten.Entity

Habe ich gegoogelt aber nicht gefunden, was definitiv über diese Nutzung habe ich versucht:

public partial class Product
{
    public bool IsShipped()
    {
        /* do stuff */
    }
}

db.Products.Where(x => x.IsShipped()).Select(...);

dann bekomme ich aber:

System.NotSupportedException wurde unhandled by user code Message=LINQ
zu Personen erkennt nicht die Methode " Boolean IsShipped ()' - Methode,
und diese Methode kann nicht übersetzt werden, in einen laden zu Ausdruck.

Source=System.Daten.Entity

gibt es Funktionen gibt, die ich nicht wollen, zu bauen, in der LINQ-Abfrage an sich... was ist ein guter Weg, dies zu behandeln?

* update *

Darin macht die gültigen Punkt, dass alles, was geschieht bei der Umsetzung von IsShipped würde konvertiert werden müssen, um eine SQL-Abfrage und der compiler wahrscheinlich nicht wissen, wie es zu tun, so abrufen alle Objekte in den Speicher scheint die einzige Wahl (es sei denn eine direkte Abfrage an die Datenbank gemacht wird). Ich habe versucht es so:

IEnumerable<Product> xp = db.Quizes
    .ToList()
    .Where(x => !x.IsShipped)
    .Select(x => x.Component.Product);

aber es erzeugt diesen Fehler:

Einer Beziehung Vielzahl Beschränkungsverletzung aufgetreten: Ein
EntityReference kann nicht mehr als ein Relevantes Objekt, aber die
Abfrage von mehr als einem zugehörigen Objekt. Dies ist ein nicht behebbarer
Fehler.

obwohl kurioserweise das funktioniert:

IEnumerable<Product> xp = db.Quizes
    .ToList()
    .Where(x => x.Skill.Id == 3)
    .Select(x => x.Component.Product);

warum würde das sein?

* update II *

sorry, dass die Letzte Anweisung funktioniert auch nicht...

* update III *

Ich schließe diese Frage zugunsten der Verfolgung einer Lösung die hier vorgeschlagen werden, zu glätten, meine Logik in einer Abfrage - die Diskussion wird sich auf dieser post. Die zweite alternative, zum abrufen der gesamten ursprünglichen Abfrage in den Speicher, ist wahrscheinlich nicht akzeptabel, aber die Dritte, die die Umsetzung der Logik als eine direkte Abfrage an die Datenbank, sind jedoch noch nicht erforscht.

Danke an alle für den wertvollen input.

  • Die "guten Weg, dies zu behandeln", völlig davon abhängt, was genau ist "das Zeugs". Die Frage ist, ob es etwas gibt, in die übersetzt werden können in SQL oder nicht. Wenn "das Zeugs" ist: return MyMappedProp1 && MyMappedProp2 dann gibt es Hoffnung (nicht, wie Sie es jetzt tun, aber in einem anderen "TROCKENEN" Weg, wahrscheinlich). Wenn Sie öffnen eine Datei auf der Festplatte in "Sachen tun" und Lesen einen Wert aus, dann gibt es wahrscheinlich keine Hoffnung. Alle Allgemeinen Lösungen, die Sie zwingen wird, um die Abfrage mit LINQ to Objects, also alles laden in den Speicher, bevor Sie die filter.
  • Nein, ich nicht etwas zu tun, aber Datenbank-Abfragen in dem "Zeug"... aber, siehe meinen letzten update zu diesem posting
  • Die Ausnahme in den "update": bekommt man diese auch, wenn Sie nur IEnumerable<Product> xp = db.Quizes.ToList(); ? Ich glaube, dieses problem hat nichts zu tun mit Ihrem IsShipped Eigenschaft. Noch etwas ist falsch in dem Modell.
  • es hat zu tun mit Darin die Idee des Holens erstmal alles. Ich habe eine IEnumerable im Test, aber was ich wirklich wollte, war eine Liste, so betrachten, dass List<Product> p1 = db.Quizes.Select(x => x.Component.Product).ToList(); funktioniert gut, aber List<Product> p1 = db.Quizes.ToList().Select(x => x.Component.Product).ToList(); produziert, die Ausnahme. Ich brauche die Letzte .ToList() da bin ich die Zuweisung an eine Liste...
InformationsquelleAutor ekkis | 2011-10-11
Schreibe einen Kommentar