【问题标题】:query generated by LINQ removes where clauseLINQ 生成的查询删除 where 子句
【发布时间】:2013-09-16 02:31:40
【问题描述】:

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

【问题讨论】:

  • 所以您希望您的 model 需要 LastNamedatabase 不需要?
  • @DStanley 是的,你是对的

标签: c# linq entity-framework-4


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多