- 0
Как составить Linq запрос один ко многим фильтрация по свойству дочернего элемента
У меня есть 2 таблицы, клиенты и заказы. Отношение один ко многим. Мне необходимо выбрать тех клиентов, чьи старейшие заказы имеют в описании слово "специальный". Если старейший заказ не имеет этого слова в описании, то клиент с этим заказом не попадает в результат. Если у клиента нет ни одного заказа, клиент не попадает в результат. Другими словами, в результат должне попасть только те клиенты, которые имеют заказы и в описании самого старого заказа есть слово "специальный".
Спасибо.
1 ответ:
-
- 1
public static class Sample
{
public static List<Client> SampleSelect(List<Client> clients)
{
return clients.Where(c => c.Orders.Count > 0 &&
c.Orders.OrderBy(o => o.Date)
.FirstOrDefault().Special == true).ToList();
}
}
public class Client
{
public Client()
{
this.Orders = new List<Order>();
}
public int ID { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public DateTime Date { get; set; }
public bool Special { get; set; }
}
[TestFixture]
public class SampleTest
{
[Test]
public void RightCaseTest()
{
var clients = new List<Client>();
var client = new Client();
client.Orders.Add(new Order() { Date = new DateTime(2009, 1, 1), Special = false });
client.Orders.Add(new Order() { Date = new DateTime(2009, 2, 1), Special = true });
clients.Add(client);
clients.Add(new Client());
Assert.AreEqual(1, Sample.SampleSelect(clients).Count);
}
[Test]
public void WrongCaseTest()
{
var clients = new List<Client>();
var client = new Client();
client.Orders.Add(new Order() { Date = new DateTime(2009, 1, 1), Special = true });
client.Orders.Add(new Order() { Date = new DateTime(2009, 2, 1), Special = false });
clients.Add(client);
clients.Add(new Client());
Assert.AreEqual(0, Sample.SampleSelect(clients).Count);
}
}