2013-07-18 4 views
0

им нужен какой-либо совет по лучшему способу кодирования ниже в LINQ?лучший способ закодировать эту инструкцию linq

var tblequipments = from d in db.tblEquipments.Include(t => t.User).Include(t => t.ChangeLog).AsEnumerable()       
    where ((d.Development != 1 || d.Development == null) && 
      (d.Deleted != 1 || d.Deleted== null) && 
      (d.Stock != 1 || d.Stock == null)) && 
      (d.DecommissionDate == Convert.ToDateTime("1900-01-01") || d.DecommissionDate == null) 
select d; 

Благодаря

+0

Если вы говорите об удобочитаемости, то что такое 'd' и что означает это обычное значение' 1'? –

+0

Извините, что я пропустил начало кода, просто есть лучший способ проверить наличие nots и nulls (возможно, в одном утверждении) или что-нибудь вообще, или это хороший оператор linq? Thans – AlexW

+1

Что в этом плохого? – cadrell0

ответ

2

Некоторые предложения:

  1. Не делать .AsEnumerable, если это абсолютно необходимо, поскольку это приведет к фильтровальному сделать а не в базе данных (где вы хотите).
  2. Оценить константы за пределами LINQ. (Для примера вы делаете Convert.ToDateTime для каждой строки, вы с оценкой (каждая строка в tblEquipments благодаря вопросу 1 выше).
  3. Предполагая, что развитие, Deleted, Шток и DecommissionDate являются обнуляемым, вы могли бы попробовать .GetValueOrDefault (0), а не значения! = 1 || значение == нуль. (Заметим, что это зависит от вашего провайдера ОРМ , поддерживающей эту конструкцию, и вы исправить # 1 выше.
  4. ли ваш допустимость пустых тестов перед сравнение, в противном случае ваш код может завершиться неудачно во время выполнения при попытке сравнить нуль со значением.
0

Попробуйте это:

DateTime decomission = Convert.ToDateTime("1900-01-01") 
db.tblEquipments.Include(t => t.User).Include(t => t.ChangeLog).AsEnumerable() 
    .Select(d => new { Object = d, ToCheck = 
            new[] { d.Development, d.Deleted, d.Stock }}) 
    .Where(a => a.ToCheck.All(x => x == null || x != 1) && 
        (a.Object.DecommissionDate == decomission || 
        a.Object.Decommission == null)) 
    .Select(a => a.Object); 
+1

Иисус! я думаю, что моя версия легче читать, чем haha ​​ – AlexW

+0

@AlexW Я не ожидал, что это будет сложно: P –