2016-12-08 3 views
-1

私はExceptメソッドを使用しようとしました。私はこのメソッドがより強力で、WHERE句よりも洗練されたSQLを生成するとは思ったが、そうではなかった。同じSQLを生成します。IQueryable .Whereと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

2つの方法はまったく異なります。あなたは特定の条件で 'どこで'を話していますか? – dasblinkenlight

+0

それぞれを使って同じSQLを得る方法の例を示すことができます。 – juharr

答えて

0

それはあなたがそれが生成されます何を考えてSQLに基づくLINQパターンを選択することが稀に価値がある:ここのサンプルです。代わりに、あなたに最も明確なコードを与える方法を使用してください。対照的に、

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

はい、 'Where'ははるかに柔軟です。 – StriplingWarrior

+0

PS - この場合、「最終的に」「最終的に」「すべてが完了して完了したら」という言葉は「最終的に」よりも優れた言葉選択肢になります。 (私はあなたが直接* finalement *、n'est ce pasから翻訳していると仮定しています) – StriplingWarrior

関連する問題