由 LINQ 生成的查询将删除 where 子句

本文关键字:删除 where 子句 查询 LINQ | 更新日期: 2023-09-27 18:30:55

我正在使用 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的值。

由 LINQ 生成的查询将删除 where 子句

我假设您正在使用代码优先来生成数据库。 似乎正在发生的事情是,您正在针对不可为空的数据库列添加IS NOT NULL条件,EF 似乎正在优化该条件。

如果数据库列不可为空,则使用 IS NOT NULL WHERE 子句毫无意义。

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