2011-08-17 7 views
1

"NOT IN"하위 쿼리를 제외하고 다음 SQL 쿼리를 LINQ로 변환했습니다.LINQ 쿼리에서 "NOT IN"을 사용하는 것이 좋습니다.

LINQ를 사용하여 이것을 구현하는 가장 효과적인 방법은 무엇입니까? 대신에 조인을 사용해야합니까?

누구든지 예제 나 지침을 제공 할 수 있다면 감사하게 생각합니다.

새로운 LINQ 쿼리 :

 return from objOpenCalls in db.OpenItemss 
       from objTasks in db.Tasks 
       .Where(t => (t.Task_ID == objOpenCalls.Parent_Task_ID)) 
       where ((objTasks.Item_ID > 0) && (objTasks.Type_ID > 0) && (objTasks.OwnerTypeItem_ID == user) && (objOpenCalls.CallEnd < DateTime.Now)) 
       orderby objOpenCalls.CallStart descending 
       select new CallMiniViewModel 
       { 
        ID = objOpenCalls.ID, 
        CallStart = objOpenCalls.CallStart, 
        Name = objTasks.Task_Title 
       }; 

올드 SQL 쿼리 :

SELECT TOP (100) ta.ID, t.Task_Title, ta.CallStart 
FROM   OpenItems AS ta INNER JOIN 
         Tasks AS t ON ta.Parent_Task_ID = t.Task_ID 
WHERE 
(t.Item_ID > 0) AND (t.[Type_ID] > 0) AND (ta.CallStart > DATEADD(m, -6, GETDATE())) 
AND (ta.ID NOT IN (SELECT  CallId FROM CallFeedback)) AND (t.OwnerTypeItem_ID = @Username)  AND (ta.CallEnd < GETDATE()) 
ORDER BY ta.CallStart DESC 

답변

2

하지에 일을 몇 가지 방법이 있습니다 아래 테스트로 LinqPad에 넣어 그냥 빨리 샘플입니다. .

class MyClass { 
    public int Id {get;set;} 
} 

void Main() 
{ 
    int[] myItems = new[] { 1, 2, 3, 4, 5, 6 }; 

    IEnumerable<MyClass> classes = new []{ 
     new MyClass { Id = 3 }, 
     new MyClass { Id = 6 }, 
     new MyClass { Id = 8 } 
    }; 

    var results = from cl in classes 
        where !myItems.Contains(cl.Id) 
        select cl;         

    foreach(var result in results) { 
     Console.WriteLine("Class {0}", result.Id); 
    } 

    var results2 = from cl in classes 
        where ( 
         from i in myItems 
         where i == cl.Id 
         select i).Count() == 0 
        select cl; 

    foreach(var result in results2) { 
     Console.WriteLine("Class {0}", result.Id); 
    }    

} 
이 나에게 문제를 이해하는 데 도움으로, 그것은 (당신이 SQL로 작업하는 경우)합니다 나는 일반적으로 다음 SQL 쿼리를 생성하고 조정 a를 미세 수있는 방법을 보여 LinqPad에서 첫 번째 코드로 연주

작은. 때로는 물건을 거기에서 실행할 수있게하려면 약간의 시간이 걸리지 만보다 복잡한 쿼리를 사용하면 가치가 있습니다.

관련 문제