Linq to SQL, используя IQueryable API для отношений 1 ко многим - PullRequest
0 голосов
/ 28 мая 2011

Предположим, что A является родительской таблицей со многими B-записями.По сути, мне нужен LINQ to SQL для генерации этого запроса:

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))
}

Есть идеи?

1 Ответ

2 голосов
/ 28 мая 2011

Извините, я набираю это в блокноте и на данный момент не могу проверить синтаксис, но я думаю, что-то вроде этого - то, что вы ищете:

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 из вашей таблицы ... Исправьте это соответствующим образом.

...