为什么实体框架在WHERE子句中添加不必要的(AND [param] IS NOT NULL)?

时间:2013-11-20 15:15:00

标签: c# .net entity-framework entity-framework-6

鉴于这个简单的模型:

public partial class UserColumnGrid
    {
        public int UserColumnGridID { get; set; }
        public int UserID { get; set; }
        public int ColumnGridID { get; set; }
        public int ColumnWidth { get; set; }
        public bool IsVisible { get; set; }

        public virtual ColumnGrid ColumnGrid { get; set; }
        public virtual User User { get; set; }
    }

这个简单的查询:(userID是一个i​​nt)

dbContext.UserColumnGrid.Where(ucg => ucg.UserID == userID).ToList();

生成以下查询:

SELECT [Extent1].[UserColumnGridID]  AS [UserColumnGridID],
       [Extent1].[UserID]            AS [UserID],
       [Extent1].[ColumnGridID]      AS [ColumnGridID],
       [Extent1].[ColumnWidth]       AS [ColumnWidth],
       [Extent1].[IsVisible]         AS [IsVisible]
FROM   [dbo].[UserColumnGrid] AS [Extent1]
WHERE  ([Extent1].[UserID] = 1 /* @p__linq__0 */)
       AND (1 /* @p__linq__0 */ IS NOT NULL)

为什么添加此AND NOT NULL标准?数据库不允许该字段中的空值,并且.net中的int不能为null

这在我的查询中都会发生。这很烦人,但是它会影响性能吗?

我怎样摆脱它?

这是基于数据库的模型。

2 个答案:

答案 0 :(得分:3)

当然会进行检查。想一想Entity Framework如何从LINQ语句构造查询。它使用大量反射(如this SO question所示)来完成工作。因此,使用反射意味着它可能不会花时间考虑特定字段的类型,或者它是否可以为空 - 特别是因为它可以添加该空检查并完成查询。

我的猜测是,这是故意的,因为使用反射来获取类型,然后查看它是否可以为空可能是一个主要的性能损失 - 特别是对于任何真正复杂的查询(如同一个很多参数)。它可能没有必要,但我认为它使日常使用变得更加简单。

答案 1 :(得分:1)

我在WHERE子句"中删除了额外的"(AND [param] IS NOT NULL)通过使用数据注释标记所需的模型类中的属性。

我正在使用EF 6。