2013-05-09 1 views
1

저는 LINQ 및 Lamda 표현식에 완전히 새내기입니다. 나는 여러 데이터베이스 테이블에서 정보를 검색하는 조금 복잡한 SQL 문이 다음 WHERE...IN SQL 절을 대체 .Contains() 방법을 사용하여,C에서 LINQ에 대한 복잡한 SQL #

SELECT A.OrderID, A.FORMJDENO, A.Title, B.Descr, C.Code, C.Descr, D.ModificationDate from OrderForm A 
LEFT JOIN OrderPriority B ON A.OrderPriorityID = B.OrderPriorityID 
LEFT JOIN StockClass C ON A.StockClassID = C.StockClassID 
LEFT JOIN AuditTrailLog D ON A.OrderID = D.ObjectID 
WHERE D.ColumnInfoID= 487 AND D.OldValue='1' AND D.NewValue='2' AND A.FormStatus=2 AND A.FormType=3 AND B.OrderPriorityID=1000001 AND C.StockClassID=1000002 
AND A.DeptID IN 
    (SELECT DeptID FROM Department WHERE InstID = 1000006) 
AND DATEDIFF(m,D.ModificationDate, A.VendorDeliveryDate) >= 3 

나는 이미 LINQ가 거의 다했다,하지만 난 joins, 구속 드 만들기 위해 도움이 필요합니다 결과는 다른 테이블에 속한 값을 기반으로하며 LINQ에서 DATEDIFF을 사용합니다. 이것은 내가 이미 가지고 있고 잘 작동하지만, 분명히 위의 SQL 문과 같은 결과를 제한하지 않습니다. 나는 성공하지 못한 채 여러 가지 방법을 시도했다.

마지막으로 내가이 작업을 얻을 수 있었다 : 나는 등가 LINQ를

업데이트가 필요합니다. 이것은 SQL 문과 동일한 레코드를 검색하는 최종 LINQ입니다. @Gert 아놀드에 많은 감사 :

var valid = dba.OrderForm 
      .Where(q => q.FormType == 3 
         && q.FormStatus == 2 
         && q.OrderPriority.OrderPriorityID == orderpriorityID 
         && q.StockClass.StockClassID == stockclassID 
         && dba.AuditTrailLog.Where(log => q.OrderID==log.ObjectID) 
           .Any(log => log.ColumnInfoID == 487 
              && log.OldValue == "1" 
              && log.NewValue == "2" 
              && EntityFunctions.DiffMonths(log.ModificationDate,  
                   q.VendorDeliveryDate) >= period) 
         && departments.Contains(q.DeptID)); 
+0

Linq에 - 투 - 엔티티 사용할 수 있습니까? 그리고 OrderForm - AuditTrailLog 협회의 다양성은 무엇입니까? –

+0

예 Linq to Entities, Visual C#에서 MVC ASP.NET 프로젝트를 개발 중입니다. OrderForm-AuditTrailLog의 다양성은 1.N – equisde

답변

3

나는이 그것에 대해 생각 :

dba.OrderForm.Where(q => q.FormType == 3 
    && q.FormStatus == 2 
    && q.OrderPriority.OrderPriorityID == 1000001 
    && q.StockClass.StockClassID == 1000002 
    && q.AuditTrailLogs 
     .Any(log => log.ColumnInfoID == 487 
       && log.OldValue == "1" 
       && log.NewValue == "2" 
       && EntityFunctions.DiffMonths(log.ModificationDate, 
               q.VendorDeliveryDate) >= 3) 
    && departments.Contains(q.DeptID)); 

난 당신이 탐색 속성 OrderTable.AuditTrailLogs있어 (또는 생성 할 수 있습니다) 가정합니다. 탐색 속성없이

당신은

&& dba.AuditTrailLogs.Where(log => q.OrderID == log.ObjectID).Any(... 
+0

입니다. @Gert Arnold에게 감사드립니다. 귀하의 코드는 좋아 보이지만'OrderForm.AuditTrailLogs' 탐색 속성이 없어서 테스트 할 수 없습니다. 어떻게 만들 수 있습니까? – equisde

+0

코드 우선, 데이터베이스 우선에 따라 다릅니다. 그러나 그것은 다른 주제가 될 것입니다. 당신은없이 할 수 내 편집을 참조하십시오. –

+0

Thanks @ Get Arnold. 네비게이션 속성을 사용하지 않고 코드를 사용하지만 VS2010은'&& log.OldValue == "1"'에 밑줄을 긋고 있습니다. 연산자'&&'는'int'와' bool'. 데이터베이스에서이 열의 데이터 형식은 varchar (4000)입니다. 어떤 생각? – equisde