•  
  • 0
  •  
0

Как составить Linq запрос один ко многим фильтрация по свойству дочернего элемента

У меня есть 2 таблицы, клиенты и заказы. Отношение один ко многим. Мне необходимо выбрать тех клиентов, чьи старейшие заказы имеют в описании слово "специальный". Если старейший заказ не имеет этого слова в описании, то клиент с этим заказом не попадает в результат. Если у клиента нет ни одного заказа, клиент не попадает в результат. Другими словами, в результат должне попасть только те клиенты, которые имеют заказы и в описании самого старого заказа есть слово "специальный".

Спасибо.

linq-to-sql, C#.
спросил 1032 дня назад Аватор пользователя Valentin Valentin
229 6
изменил 1032 дня назад Аватор пользователя Valentin Valentin
229 6
300

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);
            }
        }

    ответил 1032 дня назад Аватор пользователя SaD SaD
    55 1
    изменил 1032 дня назад Аватор пользователя SaD SaD
    55 1
Чтобы написать ответ, вы должны авторизироваться.