2013-05-09 69 views
1

林完全新手在LINQ和Lamda表達式。 我有來自多個數據庫表中檢索信息有點複雜的SQL語句:複雜SQL到LINQ在C#

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差不多完成了,使用.Contains()法取代WHERE...IN SQL條款,但我需要一些幫助,使德joins限制結果基於屬於其他表的值,並在LINQ中使用DATEDIFF等效值。 這就是我已經得到的並且工作正常,但顯然它不限制上述SQL語句的結果。我嘗試了幾種方式,但沒有成功。我需要相當於LINQ

UPDATE:

最後我能得到它的工作。這是檢索與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的多樣性是什麼? – 2013-05-09 12:33:33

+0

是Linq to Entities,我正在Visual C#下開發一個MVC ASP.NET項目。多樣性OrderForm-AuditTrailLog是1.N – equisde 2013-05-09 12:48:17

回答

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 2013-05-09 13:49:07

+0

這取決於代碼優先,數據庫優先。但那將是一個不同的話題。你可以不做,請看我的編輯。 – 2013-05-09 13:53:10

+0

感謝@Get Arnold。我使用你的代碼片段而不使用導航屬性,但VS2010強調'&& log.OldValue ==「1」'警告操作符'&&'不能應用於'int'類型的運算符, bool'。數據庫中此列的數據類型爲varchar(4000)。任何想法? – equisde 2013-05-09 14:03:52