2016-12-08 2 views
-1

Я попытался использовать метод Except. Я думал, что этот метод был более мощным и генерирует более чистый SQL, чем предложение WHERE, но нет. Он генерирует тот же sql.В чем разница между IQueryable. Где и IQueryable.Except?

Так почему/когда использование кроме метода?

EDIT: вот пример:

// Get customers except those which ID are in the LostCustomers table 
TblCustomers.Except(TblCustomers.Where(tj => LostCustomers.Select(lj => lj.CustomerId).Contains(tj.CustomerID))).Select(j => new 
{ 
    CustomerId = j.CustomerID, 
    CustomerRef = j.CustomerRef, 
    CustomerName = j.Name 
}) 

// Get customers except those which ID are in the LostCustomers table 
TblCustomers.Where(tj => !LostCustomers.Select(lj => lj.CustomerId).Contains(tj.CustomerID)).Select(j => new 
{ 
    CustomerId = j.CustomerID, 
    CustomerRef = j.CustomerRef, 
    CustomerName = j.Name 
}) 

Thx

+3

Эти два метода совершенно разные. Вы говорите о «Где» с определенным условием? – dasblinkenlight

+0

Можете ли вы показать свои примеры того, как вы получаете идентичный SQL, используя каждый. – juharr

ответ

0

Это редко стоит выбрать шаблон LINQ на основе того, что SQL вы думаете, он будет производить. Вместо этого используйте тот метод, который, как представляется, дает вам самый четкий код. Например, я хотел бы рассмотреть, за исключением быть яснее в этом случае:

var taskIds = db.Tasks.Select(task => task.Id); 
var doneTaskIds = db.TaskCompletions.Select(tc => tc.TaskId); 

var unfinishedTaskIds = taskIds.Except(doneTaskIds); 

в противоположность:

var unfinishedTaskIds = taskIds.Where(id => !doneTaskIds.Contains(id)); 

Но есть много случаев, когда Where() имеет больше смысла. Скорее всего, в приведенном выше примере вы могли бы просто сказать это, что было бы еще более ясным:

var unfinishedTasks = db.Tasks.Where(task => !task.TaskCompletions.Any()); 
+0

Да, я согласен, но, наконец, Где проще в использовании, потому что мы можем передать предикат в подпись. Это меньше ограничений – Florian

+0

Да, 'Где' намного более гибкий. – StriplingWarrior

+0

PS - в этом случае «в конечном счете», «в конце» или «когда все будет сказано и сделано», будет лучшим выбором слов, чем «наконец». (Я предполагаю, что вы прямо переводите с * finalement *, n'est ce pas?) – StriplingWarrior

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