空检查EF中的where子句

时间:2013-08-27 10:11:00

标签: sql linq entity-framework linq-to-sql linqkit

我有一个POCO实体,看起来像

public class Rebate : IEntity
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("ClassOneId")]
    public virtual ClassOne ClassOne { get; set; }
    public int ClassOneId { get; set; }

    [ForeignKey("ClassTwoCode")]
    public virtual ClassTwo ClassTwo { get; set; }
    public string ClassTwoCode { get; set; }

    public double Rebate { get; set; }

 }

如果ClassOne的值为ClassTwo,则为null,反之亦然,现在,当我想运行查询时,使用linqkit检查每个类的name属性:

var predicate = PredicateBuilder.True<Rebate>();
        if (!string.IsNullOrEmpty(term))
            predicate = predicate.And(x => (x.ClassOne != null ? 
                x.ClassOne.Name.Contains(term) : x.ClassTwo.Name.Contains(term)));

var predicate = PredicateBuilder.False<Rebate>();
        if (!string.IsNullOrEmpty(term))
            predicate = predicate.Or(x => x.ClassOne.Name.Contains(term)).
                Or(x.ClassTwo.Name.Contains(term)));

在这两种情况下,我都会得到ClassOne与该字词匹配的结果,但ClassTwo匹配时没有结果。

我对正在发生的事情的理解是,当ClassOne为空时,查询失败并且不检查ClassTwo的名称属性。我不确定的是如何在不单独运行查询并合并结果的情况下解决这个问题。

任何人都有更好的计划吗?

1 个答案:

答案 0 :(得分:0)

这有用吗?

x => (x.ClassOne != null && x.ClassOne.Name.Contains(term)) ||
     (x.ClassTwo != null && x.ClassTwo.Name.Contains(term))

我知道EF处理空值检查的方式与处理内存中对象的方式不同,因为SQL需要处理它们。如果这不起作用,请尝试在LINQPad中运行查询并检查正在执行的SQL,并检查它是否有意义。