2013-03-01 2 views
3
  • У меня есть список «Персона»
  • Каждый человек имеет список «Категория»
  • Categoty имеет два atributes: Дата и Значение

Я хочу выбрать список лиц, где последняя категория равна «B». Но я не знаю, как написать «where where» в синтаксисе Linq.Linq - Как подать заявление, где положение на максимальном элементе списка

Мой "человек" структура:

<person> 
    <id>200</id> 
    <name>Peter</name> 
    <age>25</age> 
    <categories> 
     <category> 
      <date>2012-05-01<date> 
      <value>A</value> 
     </category> 
     <category> 
      <date>2013-01-01<date> 
      <value>B</value> 
     </category> 
     <category> 
      <date>2013-02-01<date> 
      <value>C</value> 
     </category> 
    </categories> 
</person> 
+0

Является ли это LINQ к XML, или LINQ к NHibernate? –

+0

Hibernate. XML - это просто показать поля объекта Person – Gonzalo

ответ

3

Если мы предположим, что категории могут недействительны по дате:

var bPersons = persons.Where(p => 
          p.Categories 
           .OrderByDescending(c => c.Date) 
           .First().Value == "B") 
5

Вы можете использовать следующее:

List<Person> allPersons = GetListOfPersons(); 

List<Person> selectedPersons = allPersons 
    .Where((x) => x.Categories 
        .OrderBy(y => y.Date) 
        .Last() 
        .Value == "B") 
    .ToList(); 

или запроса стиль

List<Person> selectedPersons = (from person in allPersons 
           where person.Categories.OrderBy(x => x.Date).Last().Value == "B" 
           select person).ToList(); 
+0

Как установить поле «Дата» для выполнения .Last() – Gonzalo

+0

'Date' и' Value' являются взаимозаменяемыми. Вы заметите, что 'Last()' возвращает последнюю 'Category' в списке' person.Categories'. Таким образом, вы можете использовать любое свойство, которое вы хотите от этого объекта. – gunr2171

+0

Извините, «последняя категория» - это категория с последней датой. Иногда это может быть не последнее вставленное – Gonzalo

0

Если вы только с помощью XML, вы можете сделать это:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

namespace ConsoleApplication2 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var persons = XElement.Parse(xml); 

      var seq2 = from person in persons.Descendants("person") 
         where (string) person.Descendants("value").Last() == "B" 
         select person; 

      print(seq2); 
     } 

     private static void print<T>(IEnumerable<T> seq) 
     { 
      foreach (var item in seq) 
      { 
       Console.WriteLine("-------------------------------------------------"); 
       Console.WriteLine(item); 
      } 

      Console.WriteLine("-------------------------------------------------"); 
     } 

     static string xml = 
@"<persons> 
<person> 
    <id>200</id> 
    <name>Peter</name> 
    <age>25</age> 
    <categories> 
     <category> 
      <date>2012-05-01</date> 
      <value>B</value> 
     </category> 
     <category> 
      <date>2013-01-01</date> 
      <value>A</value> 
     </category> 
     <category> 
      <date>2013-02-01</date> 
      <value>C</value> 
     </category> 
    </categories> 
</person> 
<person> 
    <id>201</id> 
    <name>Mary</name> 
    <age>25</age> 
    <categories> 
     <category> 
      <date>2012-05-01</date> 
      <value>A</value> 
     </category> 
     <category> 
      <date>2013-01-01</date> 
      <value>B</value> 
     </category> 
     <category> 
      <date>2013-02-01</date> 
      <value>C</value> 
     </category> 
    </categories> 
</person> 
<person> 
    <id>202</id> 
    <name>Midge</name> 
    <age>25</age> 
    <categories> 
     <category> 
      <date>2012-05-01</date> 
      <value>C</value> 
     </category> 
     <category> 
      <date>2013-01-01</date> 
      <value>A</value> 
     </category> 
     <category> 
      <date>2013-02-01</date> 
      <value>B</value> 
     </category> 
    </categories> 
</person> 
</persons> 
"; 

    } 
} 

Это печатает:

------------------------------------------------- 
<person> 
    <id>202</id> 
    <name>Midge</name> 
    <age>25</age> 
    <categories> 
    <category> 
     <date>2012-05-01</date> 
     <value>C</value> 
    </category> 
    <category> 
     <date>2013-01-01</date> 
     <value>A</value> 
    </category> 
    <category> 
     <date>2013-02-01</date> 
     <value>B</value> 
    </category> 
    </categories> 
</person> 
-------------------------------------------------