2012-07-20 87 views
2

我的应用程序中有一个实体框架4模型。我需要它来生成的SQL语句:如何为以下SQL编写实体框架4查询?

SELECT * 
FROM  Reads   AS R 
INNER JOIN Images   AS I ON R.ReadId = I.ReadId AND I.ImageTypeId = 2 
LEFT OUTER JOIN Alarms  AS A ON R.ReadId = A.ReadId AND A.DomainId IN (103,102,101,2,1,12) AND A.i_active = 1 
LEFT OUTER JOIN ListDetails AS L ON L.ListDetailId = A.ListDetailId 
WHERE R.i_active = 1 

这是我现在有这个查询在我的代码:

var items = from read in query 
      join plate in context.Images  on read.ReadId  equals plate.ReadId 
      join temp1 in context.Alarms  on read.ReadId  equals temp1.ReadId  into alarms from alarm in alarms.DefaultIfEmpty() 
      join temp2 in context.ListDetails on alarm.ListDetailId equals temp2.ListDetailId into entries from entry in entries.DefaultIfEmpty() 
      where plate.ImageTypeId == 2 && plate.IActive == 1 
      select new { read, plate, alarm, entry.OfficerNotes }; 

如何修改实体框架查询来获取SQL查询,我需要?

回答

2

对于左连接 - 我建议使用带有where代替join一个from,我觉得它使清洁

对于内部有多个加盟加盟条件 - 你需要加入两个匹配的匿名类型,或使用一个fromwhere条件

对于X IN列表,你需要指定列表中的查询外,使用Any方法或Contains方法

List<int> domainIds = new List<int>() { 103,102,101,2,1,12 }; 

    var items = from read in query 
       join plate in context.Images 
       on new { read.ReadId, ImageTypeId = 2 } equals new { plate.ReadId, plate.ImageTypeId } 
       from alarm in context.Alarms 
            .Where(x => x.IActive == 1) 
            .Where(x => domainIds.Any(y => y == x.DomainId)) 
            .Where(x => read.ReadId == x.ReadId) 
            .DefaultIfEmpty() 
       from entry in context.ListDetails 
            .Where(x => alarm.ListDetailId == x.ListDetailId) 
            .DefaultIfEmpty() 
       select new { read, plate, alarm, entry.OfficerNotes }; 
+0

谢谢!我对代码进行了这些更改,它们完美地工作!但是,我在域ID测试中使用了“Contains”。 – 2012-07-20 15:59:24

+0

我会推荐使用Contains而不是Any。包含产生干净IN语句,而在任何产生可怕EXISTS(SELECT 1 AS [C1] FROM(SELECT ... 103 AS [C1] FROM(SELECT 1 AS X)AS [SingleRowTable1] UNION ALL SELECT 102 AS [C1] FROM( SELECT 1 AS X)AS [SingleRowTable2])AS [UnionAll1],其中[UnionAll1] [C1] = [Extent3] [域ID]) – Ruslan 2012-07-20 16:00:00

+0

@Ruslan - 。在这种情况下,你可能是正确的 - 'Contains'更好。我喜欢用'Any',因为它允许更复杂的条件 – Aducci 2012-07-20 16:04:01