【发布时间】:2017-08-28 16:11:47
【问题描述】:
我尝试在 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();
所有实体都继承IEntity接口并具有相同的字段。 _aReposytory.GetAll()、_bReposytory.GetAll() 等返回 IQueryable<T>。但是在尝试获取结果时出现错误。
指定的 LINQ 表达式包含对以下查询的引用 与不同的上下文相关联。
当我使用以下UNION 逻辑时,它是有效的。但它是四个查询执行。
var union = new List<ICdcEntity>(a);
union.AddRange(b);
union.AddRange(c);
union.AddRange(d);
如何在 LINQ 中生成单个 UNION 查询?
【问题讨论】:
-
_aReposytory.GetAll()(和其他方法)是否返回IEnumerable<T>或IQueryable<T>? -
你的错误信息很清楚。每个上下文都从您的 Linq 查询生成 SQL,但您不能从 4 个不同的上下文生成单个 SQL 语句。即使你可以,它仍然会导致四个查询。
-
我相信这里的答案正确地解释了你的错误:stackoverflow.com/a/38627389/3042383