LINQ: проблема с LINQ, использующим значения таблицы перед группой? Может ли кто-нибудь помочь - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть следующая группа,

   var stocks =
       from p in products
       from w in p.Warehouses
       from l in w.locations
       group l by l.Date into g
       let maxDate = g.Max(l1 => l1.Date)
       select new { Product=p.Name, Location= g.Where(l2 => l2.Date == maxDate) };

Но она не работает, я думаю, потому что я делаю группу, мне не разрешено использовать значения из таблиц перед группой вмой выбор.

здесь иерархия объектов.

 Products

   Each product has multiple warehouses

      Each warehouse has multiple locations.

Мне нужно вернуть все продукты, и каждый продукт должен содержать название местоположения.

Что такоекритерии для определения местоположения при наличии нескольких складов и нескольких местоположений.

Я должен искать на каждом складе и, в свою очередь, в каждом местоположении ... и возвращать ВНЕ ВСЕХ ИХ последнее местоположение (ТОЛЬКО 1), которое яопределить с помощью Date == maxDate

Но это не позволит мне выбрать «Имя», которое было в p.Его нет в g, так как g группируется по «местоположениям».

Любая помощь действительно ценится

1 Ответ

2 голосов
/ 01 апреля 2011

Я думаю, вы хотите что-то вроде этого:

var query = from product in products
            let location = (from warehouse in p.Warehouses
                            from location in p.Locations
                            orderby location.Date descending
                            select location).FirstOrDefault()
            select new { Product = product.Name,
                         Location = location };

Обратите внимание, что Location может быть нулевым, если нет подходящих местоположений.

Нет необходимости нужно чтобы использовать здесь выражение let, но я подумал, что это будет наиболее читаемый способ написания запроса.

Теперь вам не нужно на самом деле сортировать все местоположения,конечно ... но в LINQ нет MaxBy, чего вы действительно хотите.Если вы используете LINQ to Objects, вы могли бы написать свой собственный метод MaxBy (и есть один в MoreLINQ );в LINQ to SQL и т. д. Я ожидаю, что база данных все равно оптимизирует запрос.

...