Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF查询生成器_C#_Performance_Entity Framework - Fatal编程技术网

C# EF查询生成器

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,

我有一个必须在数据库表中搜索的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, 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));