0

我正在使用一个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”)。

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

4

1 回答 1

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

于 2012-06-12T04:58:02.657 回答