2011-04-18 146 views
0

我是LINQ的新手,并且被要求将我们现有的传统解决方案更新到Linq到EF4.1中的实体。将T-SQL转换为Linq

的EF模型在这里 http://i53.tinypic.com/2h6sy0m.png

我可以用基本的查询,但在广阔的,如下面的管理,是造成重大头痛。我希望你会在这种过度转换为LINQ到提供任何意见(返回Me.ObjectContext。* * ....)

SELECT  tblInspectionFailures.ID, vwBusinessUnit.Name, vwBuilds.BuildNo, tblFaultArea.Description AS [Fault Area], tblFault.Description AS Fault, 
         tblFaultsCodes.Description AS [Fault Code], tblFaultsCodesDetail.Description AS [Fault Code Detail], 
         tblFaultCode_AuditScores.Description AS [Audit Score], tblInspectionFailures.Comment, tblInspectionFailures.ShortagePart, 
         tblInspectionFailures.CreatedDate, vwUsers.DisplayName AS [Created By], tblInspectionFailures.IsAdhocTest, tblInspectionFailures.FixedDate 
FROM   tblInspectionFailures INNER JOIN 
         tblFaultArea ON tblFaultArea.ID = tblInspectionFailures.FaultAreaID INNER JOIN 
         vwBuilds ON tblInspectionFailures.BuildID = vwBuilds.ID INNER JOIN 
         tblFaultsCodes ON tblInspectionFailures.FaultCodeID = tblFaultsCodes.ID INNER JOIN 
         vwBusinessUnit ON tblInspectionFailures.BUID = vwBusinessUnit.ID INNER JOIN 
         vwUsers ON tblInspectionFailures.CreatedBy = vwUsers.ID INNER JOIN 
         tblFault ON tblInspectionFailures.FaultID = tblFault.ID LEFT OUTER JOIN 
         tblFaultCode_AuditScores ON tblInspectionFailures.AuditScoreID = tblFaultCode_AuditScores.ID LEFT OUTER JOIN 
         tblFaultsCodesDetail ON tblInspectionFailures.FaultCodeDetailID = tblFaultsCodesDetail.ID 
WHERE  (tblInspectionFailures.FaultAreaID IN (28, 72, 78)) 
      AND (tblInspectionFailures.CreatedDate BETWEEN CONVERT(DATETIME, '2011-04-01 00:00:00', 102) AND GETDATE()) 

回答

0

SQL查询的复杂化,并且有很多的内部连接和外部连接。这个答案没有考虑到这一点。然而,LINQ提供者(如实体框架)的好处在于它们可以直接暗示来自模型的连接关系。我每天编写LINQ查询,有时他们可能会变得非常复杂,但我几乎不需要在我的LINQ查询中进行显式加入。当您拥有设计数据库模型和实体框架模型时,您可以简单地将所有内容“点”在一起,而无需使用LINQ join运算符。

说够了。您将以下查询作为起点。它在给定的数据范围内以及给定的故障区域内获取数据库中的所有故障。您可以将其扩展为完全符合您的需求,但我希望这可以作为一个起点。

var faultAreas = new[] { 28, 72, 78 }; 
var minDate = new DateTime(2011, 04, 01); 
var maxDate = DateTime.Now; 

var failures =  
    from failure in context.InspectionFailures 
    where faultAreas.Contains(failure.FaultAreaID) 
    where failure.CreatedDate >= minDate 
    where failure.CreatedDate <= maxDate 
    select failure; 

祝你好运。

+0

感谢您对Steven的反馈。由于失败表基本上有一个查找ID列表,从整数查找返回描述的最佳做法是什么?然后我会将结果数据加载到IQueryable POCO – 2011-04-18 15:05:17

+0

谢谢Steven。通过扩展From子句的数量,然后指定我想要的选择它已经工作。 – 2011-04-18 15:26:01