簡體   English   中英

使用在LINQ中將IQueryable返回到實體的自定義方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM