EF查询构建器

时间:2014-11-23 20:42:12

标签: c# performance entity-framework

我有一个id列表,我必须在数据库表中搜索。

我有一个员工表,其中员工ID是主键。 我有一个员工ID列表,我必须在这个员工表中搜索<​​/ p>

我正在使用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构建查询并传递给数据库时 如下

SELECT
[Extent1].[EmployeeID] AS [EmployeeID],
[Extent1].[ReportsTo] AS [ReportsTo],
[Extent1].[PhotoPath] AS [PhotoPath],
[Extent2].[OrderID] AS [OrderID],
FROM  [dbo].[Employees] AS [Extent1]
INNER JOIN [dbo].[Orders] AS [Extent2] ON [Extent1].[EmployeeID] = [Extent2]

[雇员]     WHERE [Extent1]。[EmployeeID] IN(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)

EF查询构建器(表达式构建器)默认情况下不够智能,无法理解这些是重复值并使用一个唯一值。

现在我在列表中进行了过滤,然后将其传递给

.Where(p => eId.Contains(p.Employee.EmployeeID));

这解决了这个问题。但代码更改将在多个位置进行,并且不易维护。

但我想在EF级解决这个问题。

注意: - 我使用简单的查询来解释我的问题。但在实际项目中,我的查询量很大,数据库大小也很大。

0 个答案:

没有答案