0

我有一个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将为空,反之亦然,现在当我想运行查询检查每个类的名称属性时,使用linqkit

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为 null 时,查询失败并且不检查ClassTwo. 我不确定如何在不单独运行查询并合并结果的情况下解决此问题。

有人有更好的计划吗?

4

1 回答 1

0

这行得通吗?

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

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

于 2013-08-27T13:23:42.490 回答