[英]Using custom methods that return IQueryable in the LINQ to entities
我有兩個返回IQueryable的方法:
IQueryable<Person> GetGoodPeople();
和
IQueryable<Person> GetBadPeople();
我需要寫這個查詢:
var q = from x in GetGoodPeople()
from y in GetBadPeople()
select new { Good = x, Bad = y };
linq to實體不支持上面的代碼(拋出NotSupportedException
),除了我聲明一個變量並在查詢中使用它:
var bad = GetBadPeople()
var q = from x in GetGoodPeople()
from y in bad
select new { Good = x, Bad = y };
有沒有辦法可以直接在linq實體中使用IQueryable方法?
簡短的回答 - 這是不可能的 。 您的修復是解決問題的正確方法。
一旦實體框架(以及LINQ2Sql)開始解析表達式樹,它就太晚了。 對GetBadPeople()
的調用實際上是懶惰地執行,因此,嘗試將其轉換為SQL 本身 。
這是它的樣子:
Table(Person).Take(1).SelectMany(x => value(UserQuery).GetBadPeople(), (x, y) => new <>f__AnonymousType0`2(Good = x, Bad = y))
在這里,我寫了GetGoodPeople()
只是簡單地返回People.Take(1)
。 請注意該查詢是如何逐字記錄的 ,但GetBadPeople()
包含函數調用。
在表達式之外評估GetBadPeople()
解決方法是正確的解決方案。 這會導致表達式樹調用Expression.Constant(bad)
,而不是嘗試調用GetBadPeople()
。
這使查詢看起來像這樣:
Table(Person).Take(1).SelectMany(x => value(UserQuery+<>c__DisplayClass1_0).bad, (x, y) => new <>f__AnonymousType0`2(Good = x, Bad = y))
注意這里沒有方法調用 - 我們只是傳遞變量。
您可以使用無約束連接來近似笛卡爾積。 它似乎不容易受到NotSupportedException的影響。 我檢查了后端,它呈現了一個單獨的sql語句。
var q = from x in GetGoodPeople()
join y in GetBadPeople()
on 1 equals 1
select new { Good = x, Bad = y };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.