7

Ich versuche, Teil einer Abfrage wiederzuverwenden, weil es komplex genug ist, dass ich versuchen möchte, Code-Duplizierung zu vermeiden.Wie können Entity Framework-Abfragen wiederverwendet werden (mit Methoden)?

Es scheint, dass, wenn in einer Abfrage jede Methode aufrufen, werden Sie am Ende:

LINQ to Entities erkennt nicht die Methode {X} Verfahren und diese Methode in einer kann nicht übersetzt werden store Ausdruck

Was ich im Idealfall tun möchte, ist die Verwendung:

var q = from item in context.Items 
     where item.SomeCondition == true 
     select new {Item = item, Connections = GetConnections(item)}; 

GetConnections ist die Methode, die Abfragen auf item durchführt. Ich versuche, die (ziemlich komplexe) Abfrage in GetConnections wiederzuverwenden, aber ich bin nicht sicher, wie man das zur Arbeit bringt.

Aktuelle Signatur von GetConnections ist so etwas wie:

IQuerable<Connection> GetConnections(MyItem item) 

Antwort

11
Expression<Func<Customer, CustomerWithRecentOrders>> 
    GetCustomerWithRecentOrdersSelector() 
{ 
    return c => new CustomerWithRecentOrders() 
    { 
    Customer = c, 
    RecentOrders = c.Orders.Where(o => o.IsRecent) 
    }; 
} 

Dann später ...

var selector = GetCustomerWithRecentOrderSelector(); 
var q = myContext.Customers 
    .Where(c => c.SomeCondition) 
    .Select(selector); 
+1

Irgendeine Idee, wie man dasselbe macht, wenn man kein 'IQuerable ' hat, sondern nur 'Customer '? Ist das überhaupt möglich? –

+0

CustomerWithRecentOrders x = myContext.Customers. Wo (c => c == myCustomer) .Wählen Sie (selector) .Single() –

-1

Ihre Anfrage an mich fast perfekt aussieht. Sie können sicherlich GetConnections(item) von innerhalb Ihrer Abfrage aufrufen; Anrufen ist legal. Sie haben jedoch ein anderes Problem: Anonyme Typ-Member müssen mit Member-Namen erstellt werden (ohne diese Namen hätten Sie keine Möglichkeit, auf sie zuzugreifen).

Die folgende Abfrage kompiliert gut für mich:

var q = from item in context.Items 
     where item.SomeCondition == true 
     select new {item = item, connections = GetConnections(item)}; 

Notiere die Zugabe von item = und connections = zum select.

Bitte beachten Sie jedoch, dass Ihre GetConnections() -Methode möglicherweise static sein muss (meine war; ich war mir nicht sicher, ob Sie das versehentlich ausgelassen haben oder nicht).

+0

Es ist nicht die Zusammenstellung ist das nicht funktioniert, dann ist es die Ausführung. Ich habe den Code nicht kopiert/eingefügt, sondern ihn stattdessen per Kopf eingegeben, deshalb habe ich die anonymen Typ-Mitglieder vergessen. –

Verwandte Themen