7

我試圖重用查詢的一部分,因爲它足夠複雜,我想盡量避免代碼重複。實體框架查詢如何重用(使用方法)?

看來,調用查詢內的任何方法時,你結束了:

LINQ到實體不承認 方法{X}方法,並 這種方法不能被翻譯成 一個店內表達

我想最好做的是使用:

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

GetConnections是在item上執行查詢的方法。我試圖在GetConnections中重複使用(相當複雜的)查詢,但我不確定如何使其工作。

當前GetConnections的簽名是這樣的:

IQuerable<Connection> GetConnections(MyItem item) 

回答

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

再後來......

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

任何想法如果您沒有'IQuerable '而只是'Customer '?這甚至可能嗎? – 2010-07-13 08:28:45

+0

CustomerWithRecentOrders x = myContext.Customers .Where(c => c == myCustomer).Select(selector).Single() – 2010-07-13 12:48:34

-1

您的查詢看起來幾乎完美的我。你絕對可以在你的查詢中調用GetConnections(item);調用方法是合法的。但是,您還有其他問題:匿名類型成員必須使用成員名稱創建(沒有這些名稱,您將無法訪問它們)。

以下查詢我編譯罰款:

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

注意添加item =connections =select

但請注意,您的GetConnections()方法可能需要爲static(我是;我不確定是否意外地將它遺漏了)。

+0

這不是失敗的彙編,它的執行。我沒有複製/粘貼代碼,而是通過頭部鍵入代碼,這就是爲什麼我忘記了匿名類型成員 – 2010-07-10 22:14:19