将多个连接合并为一个列表

4
使用下面的查询,我进行了多个连接并选择它们所有。我想将此结果返回到一个列表中,因此在这种情况下,我将拥有一个包含三个元素的列表,假设有三个地址与此单个客户ID订单相关联...现在查询可以工作,但当我将exp.ToList()放入其中时,它实际上给我返回了一个二维列表(一个只有一个元素的列表,该元素是三个元素类型的列表)。我相信有一个好方法来解决这个问题...你有什么想法?
   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

0

你想要做的事情存在规范化不良的问题;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;

谢谢您对规范化的批评,但我不同意。 - Gabe
那是我的措辞不当,抱歉。尽管我确信最好使用联接表。你试过我提出的方法吗?它基本上将您的主要,次要和第三地址折叠成一个ID列表,然后针对该列表进行查询以获取所需的地址。因为LINQ是延迟执行的,所以在调用ToList()之前,您实际上不会经历迭代。 - Randolpho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接