鉴于这个简单的模型:
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是一个int)
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
这在我的查询中都会发生。这很烦人,但是它会影响性能吗?
我怎样摆脱它?
这是基于数据库的模型。
答案 0 :(得分:3)
当然会进行检查。想一想Entity Framework如何从LINQ语句构造查询。它使用大量反射(如this SO question所示)来完成工作。因此,使用反射意味着它可能不会花时间考虑特定字段的类型,或者它是否可以为空 - 特别是因为它可以添加该空检查并完成查询。
我的猜测是,这是故意的,因为使用反射来获取类型,然后查看它是否可以为空可能是一个主要的性能损失 - 特别是对于任何真正复杂的查询(如同一个很多参数)。它可能没有必要,但我认为它使日常使用变得更加简单。
答案 1 :(得分:1)
我在WHERE子句"中删除了额外的"(AND [param] IS NOT NULL)通过使用数据注释标记所需的模型类中的属性。
我正在使用EF 6。