0

我正在使用 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.

4

1 回答 1

2

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

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

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

于 2013-09-11T21:53:39.593 回答