2013-08-27 5 views
0

У меня есть POCO сущность, которая выглядит какNull проверка, где положение в EF

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, запрос не работает и не проверяет свойство name ClassTwo. Я не уверен в том, как обойти это без выполнения запросов отдельно и слияния результатов.

У кого-нибудь есть лучший план?

ответ

0

Это работает?

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

Я знаю, что EF обрабатывает нулевые чеки иначе, чем если бы вы работали с объектами в памяти из-за того, как SQL должен обрабатывать их. Если это не сработает, попробуйте запустить запрос в LINQPad и проверить, что SQL выполняется, и проверить, имеет ли смысл.

Смежные вопросы