LINQ: Как выполнить ОБЪЕДИНЕНИЕ с использованием стиля метода расширения linq для нескольких полей?

#linq #join #field

#linq #Присоединиться #поле

Вопрос:

В приведенном ниже соединении я хотел бы использовать несколько полей для выполнения объединения, а не только одно поле.

 var join = group.Join(procSums, g => g.DeptID, ps => ps.key.deptID, (g, ps)...
  

Во всех примерах, которые я нашел, для этого используется стиль запроса, и я не могу его перевести.

Спасибо!

Ответ №1:

Вам просто нужно присоединиться на основе новых анонимных объектов:

 // ClasID is a placeholder, it could be any property you'd like
var join = group.Join(procSums,
                      g => new { g.DeptID, g.UnitLoc, g.Proc },
                      ps => new 
                            { 
                              DeptID = ps.key.deptID, 
                              UnitLoc = ps.key.unitLoc,
                              Proc = ps.key.procName 
                            },
                      (g, ps) => new { g, ps });
  

Комментарии:

1. Хорошо, вот оно var join = group.Join(procSums, g => new { g.DeptID, g.UnitLoc, g.Proc }, ps => new { ps.key.deptID, ps.key.unitLoc, ps.key.procName }, (g, ps) => new { g, ps }); Но в нем есть ошибка, указывающая, что аргументы типа не могут быть выведены. Типы одинаковы, они точно совпадают.

2. @user259286 — Имена свойств в анонимных типах (а также их типы) должны точно совпадать. Я обновлю свой ответ.

Ответ №2:

Вам нужно передать лямбда-выражения, которые создают анонимные типы с полями.
Например:

 group.Join(procSums, g => new { g.DeptID, g.OtherField }, ps => new { ps.key.deptID, ps.key.OtherField }, ...)
  

Анонимные типы должны точно совпадать.