C# EF查询生成器
我有一个必须在数据库表中搜索的ID列表 我有一个employee表,其中employee id是主键。 我有一个员工id列表,我必须在这个员工表中搜索 我使用的是EF 6.1.1,SQL 2012 这是我的代码片段C# EF查询生成器,c#,performance,entity-framework,C#,Performance,Entity Framework,我有一个必须在数据库表中搜索的ID列表 我有一个employee表,其中employee id是主键。 我有一个员工id列表,我必须在这个员工表中搜索 我使用的是EF 6.1.1,SQL 2012 这是我的代码片段 using (var ctx = new NORTHWNDContext()) { var eId = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
using (var ctx = new NORTHWNDContext())
{
var eId = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
var r = ctx.Employees.
Join(ctx.Orders,
e => e.EmployeeID,
o => o.EmployeeID,
(e, o) => new { Employee = e, Order = o }
)
.Where(p => eId.Contains(p.Employee.EmployeeID));
var es = ctx.Employees;
foreach (var item in r)
{
var e = item.Employee;
var o = item.Order;
}
}
当EF构建查询并传递到数据库时
如下
[雇员ID]
其中[Extent1].[EmployeeID]在1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1中
默认情况下,EF query builder expression builder不够智能,无法理解这些是重复值并使用唯一值
现在,在将此消息传递给之前,我对列表进行了筛选
.Where(p => eId.Contains(p.Employee.EmployeeID));
这就解决了问题。但代码更改将在多个位置进行,并且不易于维护
但我想在EF层面上解决这个问题
注意:-我使用简单查询来解释我的问题。但在实际项目中,我的查询很大,数据库也很大。我认为数据库引擎足够智能,可以优化此查询。Sql Server是。所以别担心。但是,首先区分eId有什么困难呢?是的,我可以在通过之前列出不同的id列表,但这是开销,我每次都必须确保。如果我喜欢的话,还有一个问题。其中p=>eId.Distinct.Containsp.Employee.EmployeeID;这将在SQL查询中创建联合,但在大型员工id列表中失败。在这种情况下,SQL server不够智能,无法优化查询。。我尝试使用多个相似的id列表,这需要9毫秒来处理,而对于distinct,这需要不到3毫秒的时间。需要对表达式构建时间和sql查询执行时间进行排序。是的,这是正确的,构建表达式的时间将随元素数目的增加而增加。好吧,我只能说清楚了。EF就是这样。我们不能在这里提出更改请求。
.Where(p => eId.Contains(p.Employee.EmployeeID));