LINQ生成的查询删除where子句

时间:2013-09-11 21:45:45

标签: c# linq entity-framework-4

我正在使用LINQ生成一个简单的查询。 我的模特是

public class Employee
{
    public int EmployeeId {get; set;}
    public string FirstName {get; set;}        
    [Required]
    public string LastName {get; set;}
}

我的LINQ查询是

var q = db.Employees.Where (i => i.LastName != null);

此查询将转换为以下SQL(请参阅没有where子句)

SELECT 
[Extent1].[EmployeeId ] AS [EmployeeId], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName]
FROM [dbo].[Employees] AS [Extent1]

如果从模型中删除Required属性,则SQL查询会添加Where子句。所以,我假设LINQ通过删除where子句来优化查询。但我想保留Required属性并希望使用LINQ。有什么工作吗?

由于我正在使用旧数据库,因此我有一些LastName为空的记录。但我想添加Required字段,以便所有新记录都包含LastName的值。

1 个答案:

答案 0 :(得分:2)

我假设您使用代码优先生成数据库。似乎正在发生的是你在一个不可空的数据库列中添加IS NOT NULL条件,而EF似乎正在优化。

如果DB列不可为空,那么使用IS NOT NULL WHERE子句是没有意义的。

如果您的数据库列可以为空,但您希望模型需要值,则可能需要添加另一个层以将域模型与数据库模式分开。 EF旨在尽可能地为您的数据模式建模。如果要应用与数据约束不同的业务规则,则可能需要在ViewModel中使用(或适用于您的体系结构的任何内容)。