2017-08-28 30 views
0

我嘗試在LINQ生成UNION查詢:如何在LINQ中生成單一的UNION查詢?

var a = _aReposytory.GetAll().OrderByDescending(t => t.EndT).Take(100); 
var b = _bReposytory.GetAll().OrderByDescending(t => t.EndT).Take(100); 
var c = _cReposytory.GetAll().OrderByDescending(t => t.EndT).Take(100); 
var d = _dReposytory.GetAll().OrderByDescending(t => t.EndT).Take(100); 

var result = a.Cast<IEntity>().Union(b.Cast<IEntity>()) 
       .Union(c.Cast<IEntity>()).Union(d.Cast<IEntity>()).ToList(); 

所有entityes繼承IEntity接口,並具有相同的字段。 _aReposytory.GetAll()_bReposytory.GetAll()等返回IQueryable<T>。但是,當我試圖獲得結果時,我得到錯誤

The specified LINQ expression contains references to queries that are associated with different contexts.

它在使用如下因素UNION邏輯i是作品。但這是四個查詢執行。

var union = new List<ICdcEntity>(a); 
       union.AddRange(b); 
       union.AddRange(c); 
       union.AddRange(d); 

如何在LINQ中生成單個的UNION查詢?

+0

是否'_aReposytory.GetAll()'(以及其他方法)的返回'的IEnumerable '或'的IQueryable '? –

+1

你的錯誤信息非常清楚。每個上下文都會從您的Linq查詢中生成SQL,但不能從4種不同的上下文中生成單個SQL語句。即使可以,也會導致四個查詢。 – oerkelens

+0

我相信這裏的答案正確地解釋了您的錯誤:https://stackoverflow.com/a/38627389/3042383 – lancew

回答

1

如果您正在使用實體框架(或類似的東西)從數據庫中提取數據,你可以選擇讓你的數據庫執行查詢,並且只返回你想要的數據,或者你可以選擇要讀取更多數據你想在你的最終結果,並在本地內存中過濾它。

第一完成AsQueryable,後者完成AsEnumerable

雖然Queryable.Union存在,它只能團結一切都在同一個數據庫表。

您正在對不同的存儲庫執行查詢,這意味着他們的數據可能位於不同的數據庫中。

如果您想'以這種方式執行聯合,您必須在本地內存中執行此操作。 Enumerable.AsEnumerable將把你的數據帶到本地存儲器,在那裏它可以與本地存儲器中的其他數據結合在一起。

但是,如果你的數據真的應該是在同一個數據庫,那麼這將是更有效的,如果你能進行查詢AsQueryable已。您應該確保您的存儲庫使用DbContext的相同實例。在這種情況下,您應該能夠在數據庫sid上執行查詢。

順便說一句,如果你正在做團結往往這個母牛,可考慮投入一個單位的工作這一點使用單位的工作格局。

的更多信息:Implementing the repository pattern and unit-of-work patterns

0

你可以創建一個統一的類和填充在每個查詢的SELECT子句中的所有屬性,然後做一個聯盟。