【问题标题】:Null, int? and lambda expressions with EF 4.1空,整数?和带有 EF 4.1 的 lambda 表达式
【发布时间】:2023-03-12 13:33:01
【问题描述】:

我使用的是 int? lambda 表达式中的变量,但当变量为空时,生成的 SQL 确实包含“IS NULL”。

我在使用 EntityFramework 4.1 的 MVC 项目中有这个方法:

public Member GetByEmailAndOrganisationId(string email, int? organisationId)
{
    var member = memberRepository.GetSingleOrDefault(m => m.Email == email && m.OrganisationId == organisationId);

    return member;
}

但是,当我使用 SQL-Profiler 时,我可以看到生成的 WHERE 子句如下:

WHERE ([Extent1].[Email] = @p__linq__0) AND ([Extent1].[OrganisationId] = @p__linq__1),
@p__linq__0 nvarchar(4000), @p__linq__1 int, 
@p__linq__0=N'jf@beauchamp.me', @p__linq__1=NULL

因此,在上述代码中,成员始终为空,因为 WHERE 子句包含 OrganisationId = NULL 而不是 OrganisationId IS NULL。

我以为我已经通过使用 Equals() 解决了这个问题,如下所示:

var member = memberRepository.GetSingleOrDefault(m => m.Email == email && m.OrganisationId.Equals(organisationId));

但是当 organizationId 不为空时,我得到另一个错误:

仅支持原始类型(“例如 Int32、String 和 Guid”) 在这种情况下。

解决这个问题最优雅的方法是什么?

【问题讨论】:

  • WHERE 子句中的OrganisationId = NULL 在哪里?
  • @univerio [Extent1].[OrganisationId] = \@p__linq__1 和 \@p__linq__1=NULL,所以我们在 WHERE 子句中有 [Extent1].[OrganisationId] = NULL。

标签: c#-4.0 entity-framework-4 lambda


【解决方案1】:

我认为这样可以解决问题:

if(organisationId.HasValue)
    return memberRepository.GetSingleOrDefault(m => m.Email == email && m.OrganisationId == organisationId);
else
    return memberRepository.GetSingleOrDefault(m => m.Email == email && m.OrganisationId == null);

似乎在 EF 4.5 中已修复:http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions/suggestions/1015361-incorrect-handling-of-null-variables-in-where-cl?ref=title#suggestion-1015361

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多