LINQ лямбда-выражение для внутреннего объединения многие-к-одному с использованием max () - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть следующая схема:

Table1
ID int

Table2
ID int
Table1ID int
Datetime datetime

Table3
ID int
Table2ID int
Name varchar(255)

Все столбцы not null. Как мне написать следующий запрос SQL в LINQ, используя лямбда-выражения?

select Table1.*
    from Table2
    inner join (
        select Table1ID, max(Datetime) as Datetime
        from Table2
        group by Table1ID
    ) a on Table2.Table1ID = a.Table1ID and Table2.Datetime = a.Datetime
    inner join Table3 on Table2.ID = Table3.Table2ID
    inner join Table1 on Table1.ID = Table2.Table1ID
    where Name = 'me'

EDIT:

Я использую LINQ to EF. Я пытался

var myEntities = new MyEntities();
var a = myEntities.Table2.Select(x => new { x.Id, x.Datetime }).GroupBy(x => x.Id).Select(x => new { Id = x.Key, Datetime = x.Max(y => y.Datetime) });
var b = myEntities.Table2.Join(a.ToList(), x => new { Id = x.Table1Id, x.Datetime }, y => new { y.Id, y.Datetime }, (x, y) => x.Id);
return myEntities.Table3.Where(x => x.Name == "me" && b.Contains(x.Table2Id)).Select(x => x.Table2.Table1).ToList();

но возвращается с

System.NotSupportedException: Unable to create a constant value of type 'Anonymous type'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

выделение последней строки выше. Трассировка стека показывает, что ToList () выдает это исключение.

1 Ответ

1 голос
/ 08 февраля 2012

Я понял это; это было то, что

var b = myEntities.Table2.Join(a.ToList(),

должно быть

var b = myEntities.Table2.Join(a,

Кроме того, запрос должен быть

var myEntities = new MyEntities();
var a = myEntities.Table2.Select(x => new { x.Table1Id, x.Datetime }).GroupBy(x => x.Table1Id).Select(x => new { Table1Id = x.Key, Datetime = x.Max(y => y.Datetime) });
var b = myEntities.Table2.Join(a, x => new { x.Table1Id, x.Datetime }, y => new { y.Table1Id, y.Datetime }, (x, y) => x);
return b.Join(myEntities.Table3, x => x.Id, y => y.Table2Id, (x, y) => new { x.Table1, y.Name }).Where(x => x.Name == "me").Select(x => x.Table1).ToList();
...