2011-05-27 47 views
0

假设A是包含许多B记录的父表。基本上我需要的LINQ to SQL生成这个查询:Linq to SQL使用IQueryable API进行1对多关系

Select * from A 
Join B n on B.Id = A.Id 
where A.OtherId in (0,1,2,3) 
and B.DateTime >= '2011-02-03 00:30:00.000' 
and A.TypeId = 1 
order by B.DateTime 

的LINQ我是这样的:

List<string> programIds = new List<string>("0", "1", "2", "3"); 
IQueryable<A> query = db.As; 
    query = query.Where(a => programIds.Contains(a.ProgramId)); 
    query = query.Where(a => a.B.Any(b => b.DateTime >= ('2011-02-03 00:30:00.000'))); 

在这最后一条语句的问题开始,生成的查询则是这样的:

?查询

{SELECT * 
FROM [dbo].[A] AS [A] 
WHERE (EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [dbo].[B] AS [B] 
    WHERE ([B].[AirsOnStartDateTime] >= @p0) AND ([B].[Id] = [A].[Id]) 
    )) AND ((CONVERT(BigInt,[A].[OtherId])) IN (@p1, @p2, @p3, @p4)) 
} 

任何想法?

回答

2

对不起,我在记事本打字起来,目前无法验证语法,但我觉得这样的事情是你在找什么:

List<string> programIds = new List<string>("0", "1", "2", "3"); 
var query = from a in db.As 
      from b in db.Bs 
     where programIds.Contains(a.ProgramID) 
     && a.TypeID == 1 
     && a.ID == b.ID 
     && b.DateTime >= ('2011-02-03 00:30:00.000') 
     select new 
     { 
      a.... 
      b.... 
      ....     
     } 

只需填写领域你想在匿名类型选择部分返回。

此外,我对db.Bs是从表中获取B值的方法做了一个假设......根据需要修复此问题。