Как я могу установить свойства для всех элементов из запроса linq со значениями из другого объекта, который также извлекается из запроса? - PullRequest
12 голосов
/ 21 октября 2011

У меня запрос из базы данных:

List<myClass> items = new List<myClass>(from i in context
                      select new myClass
                      {
                          A = i.A,
                          B = "",    // i doesn't know this, this comes from elsewhere
                          C = i.C
                      }

У меня также есть другой запрос, делающий аналогичную вещь:

List<myClass2> otherItems = new List<myClass2>(from j in context
                            select new myClass2
                            {
                                A = j.A,   // A is the intersection, there will only be 1 A here but many A's in items
                                B = j.B
                            }

В действительности эти классы намного больше и запрашивают данные, которые разделяются не только базой данных, но и сервером. Можно ли использовать запрос LINQ для заполнения свойства B для всех items, где пересекаются элементы .A? Все встроенные предикаты LINQ отображаются только для выполнения агрегатов, выборок или выражений bool.

В моем мозгу было что-то вроде этого, но это все выключено:

items.Where(x => x.B = (otherItems.Where(z => z.A == x.A).Single().B));

Или я нелепо пытаюсь заставить эту работу работать в LINQ и должен просто отказаться от нее в пользу цикла for, где фактическая настройка становится тривиальной? Из-за крайних сроков я буду прибегать к циклу for (и, возможно, в конечном итоге он станет намного более читабельным в долгосрочной перспективе), но возможно ли это сделать? Нужен ли метод расширения, чтобы добавить специальный предикат, чтобы разрешить это?

Ответы [ 2 ]

22 голосов
/ 21 октября 2011

LINQ предназначен для запросов . Если вы пытаетесь установить вещи, вам определенно следует использовать цикл (вероятно, foreach). Это не значит, что вы не сможете использовать LINQ как часть этого цикла , но вам не следует пытаться применять побочный эффект внутри самого LINQ.

0 голосов
/ 23 октября 2011

Сначала запросите другие элементы.Сделайте ToDictionary () на результат.Затем при запросе к базе данных сделайте следующее:

var items = from i in context
   select new myClass 
   { A = i.A, 
     B = otherItems[i.A], 
     C = i.C
   } 
...