2010-12-30 2 views
6

У меня есть класс TaskWeekUI с этим определением:LINQ- Макс в котором условие

public class TaskWeekUI { 
    public Guid TaskWeekId { get; set; } 
    public Guid TaskId { get; set; } 
    public Guid WeekId { get; set; } 
    public DateTime EndDate { get; set; } 
    public string PersianEndDate { get; set; } 
    public double PlanProgress { get; set; } 
    public double ActualProgress { get; set; } } 

и я написал этот вопрос:

TaskWeekUI ti = tis.First(t => t.PlanProgress > 0 && t.EndDate == tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate)); 

Является ли это запрос верно? Могу ли я написать свой запрос лучше этого?

+0

Извините, я редактировал и добавлял запрос, я забыл его. – Shayan

+0

'p => p.PlanProgress! = Null' не требуется в вашем предложении' Where' – fearofawhackplanet

+0

Tnx, Но могу ли я написать запрос для max, где условие? – Shayan

ответ

26

Я думаю, что вы хотите, тот, чьи PlanProgress > 0 имеет самые последние EndDate.

TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0) 
        .OrderByDescending(t => t.EndDate) 
        .FirstOrDefault(); 
+1

+1, приятное четкое решение без каких-либо посторонних исключений, введенных с помощью Max. – WileCau

+1

Tnx, я думаю, что это лучшее любое простое решение. – Shayan

+2

Разве это не пустая трата времени, чтобы отсортировать весь список, чтобы получить элемент с наивысшим «EndDate»? [Это] (http://stackoverflow.com/a/1101979/1219414) кажется лучшим решением. – Juan

3

Этот запрос кажется правильным с точки зрения полученного результата.

Но во внутреннем запросе tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate) вычисляется для каждого элемента в коллекции с t.PlanProgress > 0

Таким образом, его лучший способ, чтобы получить максимальное значение за пределами запроса следующим образом:

var max = tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate); 
tis.First(t => t.PlanProgress > 0 && t.EndDate == max); 

идти дальше с. PlanProgress! = Null всегда верно, поскольку p.PlanProgress не имеет тип Nullable. Таким образом, наш код становится так:

var max = tis.Where(p => p.PlanProgress > 0).Max(w => w.EndDate); 
    tis.First(t => t.PlanProgress > 0 && t.EndDate == max); 

Или вы можете изменить определение класса и сделать p.PlanProgress обнуляемого типа:

public class TaskWeekUI { 
    public Guid TaskWeekId { get; set; } 
    public Guid TaskId { get; set; } 
    public Guid WeekId { get; set; } 
    public DateTime EndDate { get; set; } 
    public string PersianEndDate { get; set; } 
    public double? PlanProgress { get; set; } 
    public double ActualProgress { get; set; }  
} 

var max = tis.Where(p => p.PlanProgress.HasValue && p.PlanProgress.Value > 0).Max(w => w.EndDate); 
    tis.First(t => t.PlanProgress.HasValue && t.PlanProgress.Value > 0 && t.EndDate == max); 
+1

+1, единственное, что я бы изменил, это «Первое» в «FirstOrDefault», если он не может гарантировать, что всегда будет элемент с «PlanProgress> 0' –

+0

+1, но я думаю, что« коллекция .Max 'выдает исключение, если «коллекция» пуста, поэтому перед настройкой «max», вероятно, должна быть дополнительная проверка. Коллекция будет пуста, если все PlanProgress <= 0. Поскольку есть проверки для PlanProgress> 0, я предполагаю, что PlanProgress <= 0 является законным, и исключение, вероятно, не ожидается. – WileCau

+0

Tnx для вашего ответа. – Shayan

-1

Вам не нужно сравнивать PlanProgress с нулем, потому что дважды это тип структуры, он не может быть нулевым.

Если вы хотите TaskWeekUI с Max EndDate и положительным PlanProgress Вы можете попробовать этот код:

TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0).Max(w => w.EndDate); 
+0

Это приведет к присвоению 'DateTime'' TaskWeekUI' – nan

+5

Невозможно неявно преобразовать тип 'System.DateTime' в 'TaskWeekUI' – Shayan

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