2016-12-08 4 views
-1

Except 메서드를 사용하려고했습니다. 이 방법이 더 강력하고 WHERE 절보다 깨끗한 SQL을 생성한다고 생각했지만 그렇지 않습니다. 동일한 SQL을 생성합니다.IQueryable과 IQueryable의 차이점은 무엇입니까?

왜 예외 메서드를 사용합니까?

편집 :

// 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 
}) 

들으

+3

두 가지 방법은 완전히 다릅니다. 특정 조건에서'Where'에 대해 이야기하고 있습니까? – 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

예 동의합니다. 그러나 마지막으로 Where는 서명에 술어를 전달할 수 있기 때문에 더 쉽게 사용할 수 있습니다. 덜 제한적입니다. – Florian

+0

예, 'Where'는 훨씬 더 유연합니다. – StriplingWarrior

+0

PS -이 경우 "궁극적으로", "결국"또는 "모두 말하고 끝낼 때"가 "마침내"보다 더 나은 단어 선택이 될 것입니다. (나는 당신이 * finalement *, n'est ce pas에서 직접 번역한다고 가정하고 있습니다.) – StriplingWarrior