LINQ Únete en la parte superior 1
Tengo tres objetos (splistitemcollection) que estoy uniendo, lo que funciona muy bien, pero el problema que tengo es que hay una relación de uno a muchos entre un objeto de contrato y un objeto de clientes. Necesito tomar solo el primer objeto de clientes para cada objeto de contrato durante la unión.
Esto es lo que estoy obteniendo
(Contract)(Customer) 12345 John Smith 12345 Jane Smith 67890 howard Jones 67890 Mary Jones
Esto es lo que quiero 12345 (solo uno de los clientes, Jane o John)
Aquí está el código que estoy usando actualmente.
var joinedResults = from SPListItem contracts in _contractList
join SPListItem customers in _customerList
on contracts["ContractNumber"] equals customers["ContractNumber"]
join SPListItem loans in _loanList
on contracts["ContractNumber"] equals loans["Contract_x0020_Number"]
into l from loans in l.DefaultIfEmpty()
select new MergedData(contracts, customers, loans);
En SQL, definiría una cláusula top select en una subconsulta definida en mi unión, simplemente no puedo entender la sintaxis de mi cerebro novato linq.
Resultado final
var joinedResults = from SPListItem contracts in _contractList
join SPListItem customers in
// Derived subset
(from SPListItem customers in _customerList
group customers by customers["ContractNumber"] into groupedCustomers
select groupedCustomers.FirstOrDefault()
) on contracts["ContractNumber"] equals customers["ContractNumber"]
join SPListItem loans in _loanList
on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] into l
from loans in l.DefaultIfEmpty()
select new MergedData(contracts, customers, loans);