2013-05-09 67 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