LINQ Присоединяйтесь к началу 1 - PullRequest
5 голосов
/ 25 октября 2010

У меня есть три объекта (splistitemcollection), которые я объединяю, и это прекрасно работает, но проблема в том, что между объектом контракта и объектом клиентов существует отношение один ко многим.Мне нужно получить только первый объект клиентов для каждого объекта контракта во время соединения.

Вот что я получаю

(Contract)(Customer)
12345  John Smith
12345  Jane Smith
67890  howard Jones
67890  Mary Jones

Вот то, что я хочу 12345 (только один изклиенты, джейн или джон)

Вот код, который я сейчас использую.

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

В SQL я бы определил предложение select top в подзапросе, определенном в моем соединении, я просто не могу обернуть голову вокруг синтаксиса моего мозга новичка linq.

Окончательный результат

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

Ответы [ 3 ]

4 голосов
/ 25 октября 2010

Сначала я объясню это, потому что LINQ иногда выглядит сбивающим с толку.Идея состоит в том, чтобы взять запрос ваших клиентов и сгруппировать его по ContractNumber, а затем взять первый.Если вы хотите, чтобы вы могли сделать заказ по какому-либо полю, чтобы он был более детерминированным (всегда с самым низким именем в алфавитном порядке и т. Д.), Тогда вы просто присоединяетесь к своему tempQuery, который будет в основном отличным (ContractNumber) и первым клиентом.,

var tempQuery =  from SPListItem customers in _customerList
    group customers by customers["ContractNumber"] into gby 
    select gby.First();


var joinedResults =

    from SPListItem contracts in _contractList
    join SPListItem customer in tempQuery
on contract["ContractNumber"] equals customer["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, 
     customer, 
     loans
   );

}
0 голосов
/ 25 октября 2010

Это похоже на запрос Top (1) по каждому возвращенному контракту:

var joinedResults = from SPListItem contracts in _contractList
                      join SPListItem loans in _loanList
                      on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] 
                      into l from loans in l.DefaultIfEmpty()
                      select new MergedData(contracts, 
                      customer = _customerList.Where( c => c["ContractNumber"] == contracts["ContractNumber"].FirstOrDefault()
                      , loans);
0 голосов
/ 25 октября 2010
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)).FirstOrDefault();

Просто вызовите метод FirstOrDefault, чтобы выбрать первый найденный элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...