Конвертировать SQL в LINQ To Entities - PullRequest
1 голос
/ 05 августа 2011

Как я могу преобразовать следующий SQL из этой статьи:

select type, variety, price
from fruits
where price = (select min(price) from fruits as f where f.type = fruits.type)

Я пробовал это так:

ctx.Fruits.
Where(f => f.Price == ctx.CreateObjectSet<Fruit>().
Where(f1 => f1.Type == f.Type).Min(f1 => f1.Price));

но это не работает, потому что ctx.CreateObjectSet не может быть переведен в SQL.

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

Почему не просто

ctx.Fruits.
Where(f => f.Price == ctx.Fruits.
Where(f1 => f1.Type == f.Type).Min(f1 => f1.Price));
1 голос
/ 05 августа 2011

Возможно, будет понятнее и проще, если вы укажете это в виде цены заказа, сгруппируйте по виду фруктов, а затем просто «выберите» первые фрукты в каждой группе. А поскольку GroupBy сохраняет порядок, вы можете выполнить первую (или вторую) сортировку в зависимости от того, что легче читать (или на основе производительности, если это имеет значение).

1 голос
/ 05 августа 2011

Ответ Михаила Сагаловича является правильным для данного SQL, но имейте в виду, что если несколько фруктов одного типа имеют одинаковую минимальную цену, вы получите несколько записей для этого типа.

Это может быть больше, чем вы собираетесь: захватить только один фрукт по самым низким ценам для каждого типа:

ctx.Fruits.GroupBy(f => f.Type)
    .Select(g => g.OrderBy(f => f.Price).FirstOrDefault())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...