Что такое запрос Linq, который получит каждый objX, где objX.created = {newest}? - PullRequest
1 голос
/ 19 февраля 2010

Этот оказывается для меня головоломкой. Я почти ненавижу просить помощи из-за страха, что могу пропустить бесконечную бессонную ночь, пытаясь разгадать эту тайну. JK

У меня есть проект на C #, в котором мне нужно отобразить список уникальных объектов, но только самый новый, основанный на типе объекта. В целях обсуждения давайте поговорим о «фруктах». Предположим, у меня есть список фруктов, каждый с "выбранной датой". Там нет первичного ключа. Итак, мой общий список типа "Фрукты" может выглядеть так ...

{'Apple','1/2/2010'}
{'Apple','11/12/2009'}
{'Apple','2/14/2010'}
{'Grape','5/2/2009'}
{'Orange','10/30/2009'}
{'Mango','2/13/2010'}
{'Apple','6/30/2009'}
{'Orange','10/5/2009'}
{'Grape','2/1/2010'}

Мне нужно урезать этот список только до самого нового фрукта каждого типа. Результаты должны быть ...

{'Apple','2/14/2010'}
{'Orange','10/30/2009'}
{'Mango','2/13/2010'}
{'Grape','2/1/2010'}

В реальной ситуации я использую Linq для SQL. Итак, я хотел бы оставаться в курсе того, что я делал.

Это, наверное, что-то НАСТОЛЬКО простое, и позже я буду смущен, я даже спросил. Но мне нужно знать, так что, думаю, мне просто придется принести жертву.

Ответы [ 6 ]

6 голосов
/ 19 февраля 2010

Что-то вроде этого должно сделать это:

var query = from item in db.Items
            group item by item.Fruit into grouped
            select grouped.OrderByDescending(x => x.Date)
                          .First();

Другими словами, группировка по названию фрукта и для каждой группы упорядочение по дате и получение первого результата.

1 голос
/ 19 февраля 2010

Вы хотите выполнить группировку по ключу (в данном случае Fruit), а затем упорядочить группу по значениям (в данном случае Created), выбрав первый элемент из каждой группы, упорядоченный следующим образом:

from each f in FruitCreatedDates
group f by f.Created into g
select new 
{ 
    Fruit = g.Key, 
    Newest = g.OrderedByDescending(fr => fr.Created).First() 
};
0 голосов
/ 19 февраля 2010

На вашем месте я бы создал пользовательский объект для инкапсуляции этих данных.Таким образом, вы можете запускать запросы LINQ для вашего сердца.

public struct Fruit
{
    public string Name;
    public string FreshDate;
}

Тогда я бы запустил запрос следующим образом:

List<Fruit> fruitArray = new List<Fruit>
{
new Fruit { Name = "Apple", FreshDate = "1/2/2010"},
new Fruit { Name = "Apple", FreshDate = "11/12/2009"},
new Fruit { Name = "Apple", FreshDate = "2/14/2010"},
new Fruit { Name = "Grape", FreshDate = "5/2/2009"},
new Fruit { Name = "Orange", FreshDate = "10/30/2009"},
new Fruit { Name = "Mango", FreshDate = "2/13/2010"},
new Fruit { Name = "Apple", FreshDate = "6/30/2009"},
new Fruit { Name = "Orange", FreshDate = "10/5/2009"},
new Fruit { Name = "Grape", FreshDate = "2/1/2010"}
};

var resultArray = fruitArray.GroupBy(f => f.Name).Select(g => g.OrderBy(f => DateTime.Parse(f.FreshDate)).Last());

Вы не должны запускать запрос на несколькихразмерный массив строк.Легче читать на пользовательском объекте.

0 голосов
/ 19 февраля 2010

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

var list = new List<Fruit>() { 
    new Fruit() {Name = "Apple", Created = new DateTime(2010, 1, 2)},
    new Fruit() {Name = "Apple", Created = new DateTime(2010, 2, 2)},
    new Fruit() {Name = "Apple", Created = new DateTime(2010, 3, 2)},
    new Fruit() {Name = "Grape", Created = new DateTime(2011, 4, 2)},
    new Fruit() {Name = "Grape", Created = new DateTime(2011, 5, 2)},
    new Fruit() {Name = "Grape", Created = new DateTime(2011, 6, 2)},
};

var query =
        from fruit in list
        group fruit by fruit.Name into grouped
        select grouped.Min(f => f.Created);
0 голосов
/ 19 февраля 2010

похоже, вам нужен групповой и максимальный (дата). Я думаю чисто по-SQL, но я уверен, что вы сможете понять Linq для этого.

0 голосов
/ 19 февраля 2010

Я не очень знаком с синтаксисом Linq to SQL, но в SQL вы бы использовали отдельный выбор в сочетании с ордером на дату создания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...