Linq in C#需要查询 - 一对多关系,需要一对多记录

问题描述:

需要帮助在linq中完成。Linq in C#需要查询 - 一对多关系,需要一对多记录

我有3张桌子。

  1. 客户

  2. CustumerOrder

  3. 订单明细

我需要在一个查询中的所有客户列表(前提是他们已经把ATLEAST一个顺序)的所有订单仅当订单价值高于100时才为每位客户订购。

问候,

恶劣

+2

请添加比表名更多的细节。例如,列。更好的是,因为这是LinqToSql,请改为提供您的类/属性名称。 – 2010-10-22 18:57:55

+0

嗨Kirk,可以说有以下列 - 1.客户 - 客户Id,客户名称2.客户订单 - OrderId,CutomerId,OrderAmount 3. OrderDetails - OrderId,OrderDate ......现在请让我知道如何获得收集像Dictionary >使用Linq查询.......希望这很好解释。这只是常见的客户订单情景,您可以根据情景假设其他细节。 – 2010-10-23 09:09:53

我说你想是这样的:

from c in Customers 
where c.CustomerOrders.Any() 
select new 
{ 
    customer, 
    Orders = 
    from co in c.CustomerOrders 
    where co.TotalPrice > 100 
    select co.OrderDetails 
} 

或者,如果你不在CustomerOrder表中没有“TotalPrice”列,请用以下内容替换内部查询:

Orders = 
    from cp in c.CustomerOrders 
    where co.OrderDetails.Sum (od => od.Price) > 100 
    select co.OrderDetails 

编辑:如果你想与OrderTotalPrice 100多家,包括客户只与至少一个订单,使用声明:

from c in Customers 
let highValueOrders = 
    from co in c.CustomerOrders 
    where co.TotalPrice > 100 
    select co.OrderDetails 
where highValueOrders.Any() 
select new 
{ 
    customer, 
    highValueOrders 
} 

您可以用类似的方式添加更多的条件。

+0

非常感谢大家。我非常感谢快速回复。 但此查询不考虑该部分 - 客户将是最终名单只有当他有ATLEAST一个为了与OrderTotalPrice超过100 + 其实我有几个条件,这里列入客户的最终选择 - 如果客户的类型为“常规”客户,或者年龄> 35,如果客户的类型为“稀有”,则只有至少有一个订单的年龄> 30时才选择客户。 CustomerType存储在CustomerDetails表中。 请帮我这个.. 问候, Harshal – 2010-10-23 07:17:44

+0

非常感谢乔..几个问题 - 1,我们可以调用LINQ查询或Lambda表达式内C#的功能呢?我需要这个来计算年龄,在我的数据库中有一个生日字段,我需要从这个字段计算年龄2.我如何从上面的LINQ查询获取列表,现在我只需要从上面的查询客户有更多的行数woth客户详细信息。我真的很困惑。不知道我怎么能通过这个UI。我可以得到像Dictionary >的东西吗? – 2010-10-23 09:04:35

+0

你不能在通过L2S或EF管道的lambda表达式中调用你自己的函数。有关解决方法,请查看:http://mathgeekcoder.blogspot.com/2008/07/advanced-domain-model-queries-using.html – 2010-10-24 01:28:57

下面是根据了一些假设一个猜测:

var result = 
    from customer in Customers.Where(a => a.CustomerOrder.Count > 0) 
    from order in CustomerOrder.Where(a => a.OrderDetails.Sum(b => b.Price) > 100) 
    select new 
    { 
     customer, 
     order.OrderDetails 
    }