Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094

Запрос LINQ (сложный)

05.09.2019, 09:52. Показов 3551. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Необходимо написать запрос.
- есть три заказа в которых размещены объект, сами заказы находятся в коллекции «AllOrders»;
- есть, выбранные неизвестным, объекты RO2, RO3 (Стул и чашка). Коллекция «SelectedRO»
Необходимо найти заказы из коллекции «AllOrders», содержащие эти объекты и убрать все остальные объекты из этих заказов.

В результате должны быть получены следующие объекты:
Order1 содержащий RO2, RO3 (Стул и чашка)
Order2 содержащий RO2 (Стул)
Помогите пожалуйста, я уже третий час мучаюсь, все идеи иссякли.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Program
    {
        static void Main(string[] args)
        {
            RentObject RO1 = new RentObject() { Id = 1, Name = "Стол" };
            RentObject RO2 = new RentObject() { Id = 2, Name = "Стул" };
            RentObject RO3 = new RentObject() { Id = 3, Name = "Чашка" };
            RentObject RO4 = new RentObject() { Id = 4, Name = "Тарелка" };
 
            //RO1, RO3, RO2
            Order Order1 = new Order() 
            {
                Id = 1,
                Number = "n1",
                RentObjects = new List<RentObject>() { RO1, RO3, RO2 }
            };
 
            //RO2, RO4
            Order Order2 = new Order()
            {
                Id = 2,
                Number = "nw2",
                RentObjects = new List<RentObject>() { RO2, RO4 }
            };
 
            //RO1, RO4
            Order Order3 = new Order()
            {
                Id = 3,
                Number = "nz3",
                RentObjects = new List<RentObject>() { RO1, RO4 }
            };
 
            IList<RentObject> SelectedRO = new List<RentObject>() { RO2, RO3 };
 
            IList<Order> AllOrders = new List<Order>() { Order1, Order2, Order3 };
        }
    }
 
    class Order
    {
        public int Id { get; set; }
        public string Number { get; set; }
 
        public ICollection<RentObject> RentObjects;
 
        public Order()
        {
            RentObjects = new List<RentObject>();
        }
    }
 
    class RentObject
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.09.2019, 09:52
Ответы с готовыми решениями:

Запрос LINQ
Добрый день. Помогите написать запрос. Необходимо получить объекты из коллекции, которых нет в другой коллекции. В результате...

Запрос LINQ
Добрый день. Помоги с запросом, а то не могу сообразить. Необходимо &quot;С хлопнуть данные&quot;, должно остаться 3 заказа a1, a2 ,a3 с...

Написать LINQ запрос
Добрый день, помогите, пожалуйста, с решением задания. Написать LINQ- запрос, который в коллекции Dictionary&lt;Time, string&gt; dict...

49
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
05.09.2019, 12:54
Студворк — интернет-сервис помощи студентам
Элд Хасп, не, не только проверить есть ли хоть один общий элемент, но получить их все и вывести.
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
05.09.2019, 13:01  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
На самом деле вариантов можно много придумать, например вот еще. Оно не изменяет изначальные объекты
Да, Дейт К. в свой книге "SQL и реляционная теория. Как грамотно писать код на SQL - 2010"
Приводит пример как один и тот же запрос можно написать 10 разными способами и это не придел.
Весь вопрос том, сколько у вас времени на подумать!

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для сравнения только по Id класс компаратора
Я не смогу быстро разобраться в компараторе =( и переделать его под свои нужны.
Нужно ещё интерфейс написать и кучу всего, работа должна быть завершена сегодня.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
05.09.2019, 13:06
Цитата Сообщение от Чипс Посмотреть сообщение
Ну я специально добавил
Если ваши классы Order и RentObject предназначены для хранения данных БД, то в них очень желательно (на практике ОБЯЗАТЕЛЬНО) надо реализовывать интерфейсы IEquatable<T>, IComparable<T> очень часто нужны и реализации IEqualityComparer<T>, ICloneable

Реализовав интерфейсы сравнения - отпадёт нужда во внешних компараторах и работа с методами расширения LINQ станет подобной с БД.
1
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
05.09.2019, 13:45  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если ваши классы Order и RentObject предназначены для хранения данных БД, то в них очень желательно (на практике ОБЯЗАТЕЛЬНО) надо реализовывать интерфейсы IEquatable<T>, IComparable<T> очень часто нужны и реализации IEqualityComparer<T>, ICloneable
Ох как я хочу узнать побольше! Жаль, что времени нет =(
0
1532 / 538 / 127
Регистрация: 09.01.2018
Сообщений: 1,750
05.09.2019, 14:05
Чипс, Читал всю тему, аж три страницы и так и не понял что за проблемы с базой. Ну взяли вы из нее ордера, изменили эти ордера и обновили их в базе. В вашем случае, задача решается очень просто, с помощью пересечений.

C#
1
2
3
4
5
6
7
8
            //выбираем интересующие нас заказы
            var query = AllOrders.Where(o => o.RentObjects.Intersect(SelectedRO).Any());
 
            //заменяем выбранным заказам коллекции арендованных объектов на те, что соответствуют условиям
            foreach (var item in query)
            {
                item.RentObjects = item.RentObjects.Intersect(SelectedRO).ToList();
            }
Вытянули нужные заказы. Поменяли в них что либо, а дальше вы либо обновляете существующие заказы, либо сохраняете новые (не знаю какая логика у вас там предусмотрена).
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
05.09.2019, 14:14
Цитата Сообщение от escoult Посмотреть сообщение
В вашем случае, задача решается очень просто, с помощью пересечений.
Я этот ответ уже дал. Так и не понял почему Чипса он не устраивает
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
05.09.2019, 14:32  [ТС]
Цитата Сообщение от escoult Посмотреть сообщение
Чипс, Читал всю тему, аж три страницы и так и не понял что за проблемы с базой.
Не с базой проблема, а со мной, знаю плохо C#. Хорошо, хоть ума хватает разобрать в подсказках.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я этот ответ уже дал. Так и не понял почему Чипса он не устраивает
Нервы, давит срок, я нервничаю и поэтому плохо соображаю.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
05.09.2019, 14:56
Элд Хасп, escoult, отвечу, почему Intersect() может не устраивать.
В заказе совершенно нормально, если будут несколько строк с одинаковым Id товара.
А там уже никакие правила эквивалентности не помогут пересечению множеств.
0
1532 / 538 / 127
Регистрация: 09.01.2018
Сообщений: 1,750
05.09.2019, 15:12
Цитата Сообщение от amr-now Посмотреть сообщение
В заказе совершенно нормально, если будут несколько строк с одинаковым Id товара.
Теоретически да. Практически - вряд ли возможно. В таком случае у товара должно быть свойство `Quantity`.
Кто то решил арендовать для вечеринки 300 стульев, 50 столов и тарелок с запасом на каждого. Сколько страниц отчета потребуется? Т.е. логика в этом конечно имеется, но на практике где это могло бы найти применение? Ну и понятно что если таковая необходимость все же имеется, то это должно быть обязательным условием и Linq запросы тогда будут другими.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
05.09.2019, 15:42
Цитата Сообщение от amr-now Посмотреть сообщение
отвечу, почему Intersect() может не устраивать.
В заказе совершенно нормально, если будут несколько строк с одинаковым Id товара.
А там уже никакие правила эквивалентности не помогут пересечению множеств.
И как это может помешать?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        static void Main(string[] args)
        {
            RentObject RO1 = new RentObject() { Id = 1, Name = "Стол" };
            RentObject RO2 = new RentObject() { Id = 2, Name = "Стул" };
            RentObject RO22 = new RentObject() { Id = 2, Name = "Стул" };
            RentObject RO3 = new RentObject() { Id = 3, Name = "Чашка" };
            RentObject RO4 = new RentObject() { Id = 4, Name = "Тарелка" };
 
            //RO1, RO3, RO2
            Order Order1 = new Order() { Id = 1, Number = "n1", RentObjects = new List<RentObject>() { RO1, RO3, RO2, RO22 } };
 
            //RO2, RO4
            Order Order2 = new Order() { Id = 2, Number = "nw2", RentObjects = new List<RentObject>() { RO2, RO4 } };
 
            //RO1, RO4
            Order Order3 = new Order() { Id = 3, Number = "nz3", RentObjects = new List<RentObject>() { RO1, RO4 } };
 
            IList<RentObject> SelectedRO = new List<RentObject>() { RO22, RO3 };
 
            IList<Order> AllOrders = new List<Order>() { Order1, Order2, Order3 };
 
            ///// Сравнение как объектов (по ссылкам)
            //var SelectedOrder = AllOrders.Where(order => SelectedRO.Intersect(order.RentObjects).Any());
            //Console.WriteLine("Выбранные заказы : "+string.Join(", ", SelectedOrder.Select(ord => $"{{ Id={ord.Id}, Number=\"{ord.Number}\"}}")));
 
            /// Сравнение через компаратор (по значениям)
            var SelectedOrder = AllOrders.Where(order => SelectedRO.Intersect(order.RentObjects, new RentObjectIdOnlyComparer()).Any());
            Console.WriteLine("Выбранные заказы : " + string.Join(", ", SelectedOrder.Select(ord => $"{{ Id={ord.Id}, Number=\"{ord.Number}\"}}")));
 
            Console.ReadKey();
        }
КонсольВыбранные заказы : { Id=1, Number="n1"}, { Id=2, Number="nw2"}


Или вы нечто другое имели ввиду?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2019, 15:42

LINQ групповой запрос+
Здравствуйте, не могли бы хотя бы намекнуть. Я нашел пример, он приведен ниже using System; using System.Collections.Generic; ...

LINQ запрос из ArrayList
Здравствуйте, сразу скажу, что я понимаю что лучше бы использовать List &lt;T&gt;, но переделывать слишком много. А проблема вот такая. Есть код...

Необычный LINQ запрос
Помогите пожалуйста, даже сообразить не могу, string names = { &quot;Alonso&quot;, &quot;Zheng&quot;, &quot;Smith&quot;, &quot;Jones&quot;, &quot;Smythe&quot;,...

Запрос Linq с конвертированием
Всем привет Ситуация такая. Есть две таблицы, связанные отношениями. пишу запрос: var r = from rs in db.Request ...

Как написать LinQ запрос
Есть массив: _zones = new TD; _zones = new TD(); _zones.Type = &quot;example1&quot;; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru