Linq-to-entity: легко найти максимальное значение в SQL, но сложно в LINQ - PullRequest
0 голосов
/ 21 июля 2010

Я начал использовать Linq-to-entity с .NET 3.5 и столкнулся со сценарием, с которым я могу очень легко справиться с SQL, но у меня большие трудности с linq. У меня есть таблица в базе данных SQL с тремя полями, для целей этого примера я назову их foo, bar и foo_index и заполню их так:

Blockquote

фу | бар | foo_index

555 101 1

555 101 2

555 101 3

555 101 4

555 101 5

Чтобы узнать, какой бар находится в максимуме foo_index, где foo = 555, SQL равен


SELECT bar, max(foo_index) as max_foo_index
FROM T
WHERE foo=555
GROUP BY bar

Я написал некоторый код linq-to-entity в C #, который работает, но у меня есть ощущение, что существует гораздо более изящное решение, и я упускаю некоторую концепцию, которая значительно облегчила бы следующее. Кроме того, есть ли другой способ, кроме foreach, чтобы получить данные из VAR?


db_entity db = new db_entity();

var q =
     from table in db.T
     where table.FOO == 555
     select new { table.BAR, table.FOO_INDEX };

var q2 = 
     from t2 in q
     where t2.FOO_INDEX == table.Max(r => r.FOO_INDEX)
     select new { t2.BAR };

int result = 0;

foreach (var record in q2}
{
    result = record.BAR.Value;
}

Любая помощь или руководство будут оценены, спасибо!

Ответы [ 2 ]

8 голосов
/ 21 июля 2010

Я думаю, что это должно работать:

var query = from item in db.T
            where item.FOO == 555
            group item by item.BAR into g
            select new { Bar = g.Key, Max = g.Max(x => x.FOO_INDEX) };

Таким образом, в основном вы используете тот же подход, что и в SQL: сгруппируйте данные, затем возьмите ключ для группы и максимальный FOO_INDEX в группе..

2 голосов
/ 21 июля 2010

Вы можете группировать элементы в LINQ to Entities так же, как в SQL. Синтаксис будет выглядеть примерно так:

var q = from t in db.T
        where t.FOO == 555
        group t by t.BAR into g
        select new { 
                       Bar = group.Key, 
                       Max = g.Max(b => b.FOO_INDEX) 
                   };
...