Несколько объединений в один список - PullRequest
4 голосов
/ 24 февраля 2010

С помощью запроса ниже я делаю несколько соединений и выбираю их все. Я хочу вернуть этот результат в список, поэтому в этом случае у меня будет список со счетом три, при условии, что с этим единственным порядком идентификатора клиента связано три адреса ... Сейчас запрос работает, но я поставил exp .ToList () это дает мне по сути 2d список (список с одним элементом, в котором этот элемент является списком типов из 3 элементов. Я уверен, что есть хороший способ сделать это ... мысли?

   var exp = (

        from t in this.reposOrders.All()

        join p1 in this.reposAddress.All()
        on t.AddressPrimary equals p1.AddressID into pp1
        from p1 in pp1.DefaultIfEmpty()

        join p2 in this.reposAddress.All()
        on t.AddressSecondary equals p2.AddressID into pp2
        from p2 in pp2.DefaultIfEmpty()

        join p3 in this.reposAddress.All()
        on t.AddressThird equals p3.AddressID into pp3
        from p3 in pp3.DefaultIfEmpty()

        where t.CustomerID == customerID

        select new { p1, p2, p3 }
    );

Ответы [ 2 ]

2 голосов
/ 25 февраля 2010

Можете ли вы использовать SelectMany ? Здесь много образцов linq http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

0 голосов
/ 25 февраля 2010

То, что вы хотите сделать, страдает от плохой нормализации; AddressPrimary, AddressSecondary и AddressThird не должны быть полями Orders (я предполагаю заказ из вашей строки from t in this.reposOrders.All()), но должны содержаться в слабой сущности или в таблице соединений.

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

var primary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressPrimary;
var secondary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressSecondary;
var tertiary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressThird;
var ids = primary.Union(secondary).Union(tertiary);
var addresses = from a in this.reposAddress.All() where ids.Contains(a.AddressID) select a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...