LINQ Group by Clause with Where子句

时间:2013-11-28 10:51:37

标签: c# linq-to-sql

我正在学习LINQ。有人可以帮我解决以下问题!

来自 Northwind 客户订单表:

我想“查找已完成超过20个订单的所有客户

SQL Server中的查询同样是:

SELECT * FROM Customers WHERE CustomerID in (SELECT CustomerID FROM Orders GROUP BY CustomerID HAVING COUNT(CustomerID) > 20)

但是,我无法在LINQ中编写等效内容。

我试过如下:

var customers = ctx.Customers.Where(o => o.CustomerID.Count() > 20).GroupBy(o => o.CustomerID);

我在事件日志中发现以下错误:

异常信息:     异常类型:HttpCompileException     异常消息:e:\ Ashok \ WEB \ VS2012 \ CSHWEB \ CSHWEB \ LINQ01.aspx(17):错误CS0103:当前上下文中不存在名称“订单”

原因是可能尚未加载从属Orders表。但是,我不明白如何让它发挥作用!

5 个答案:

答案 0 :(得分:1)

应正确配置对象之间的关系。如果您正在使用实体框架,只需将Orders实体中的Customers属性标记为virtual,这将允许延迟加载。然后您的查询将更加简单。否则,您仍然可以从Orders开始,而不是Customers

var customers = ctx.Orders.GroupBy(c => c.CustomerID)
                             .Where(x => x.Count() > 20)
                             .SelectMany(g => g.Select(o => o.Customer));

对于客户(virtual订单集合)非常简单:

var customers = ctx.Customers.Where(c => c.Orders.Count() > 20);

答案 1 :(得分:1)

如果客户和订单相关(1:MANY)并且您已设置对象模型以反映这一点,那么您可以这样做:

var customers = ctx.Customers.Where(c => c.Orders.Count() > 20);

如果没有,那么:

var customerIds = ctx.Orders.GroupBy(x => x.CustomerID)
.Where(x => x.Count() > 20);
.SelectMany(x => x.CustomerID);

var customers = ctx.Customers.Where(x => customerIds.Contains(x.CustomerID));

答案 2 :(得分:1)

你可以这样做:

var customers = from c in Customers where c.Orders.Count() > 20 select c;
customers.GroupBy(o => o.CustomerID);

答案 3 :(得分:1)

尝试使用像这样的join..into clause

var customers = from c in ctx.Customers
                join o in ctx.Orders on c.CustomerID equals o.CustomerID into orders
                where orders.Count()>20
                select c;

答案 4 :(得分:1)

为了写入此类查询,您需要使用数据库关系(Navigation Property)。此关系应在您的上下文中声明为Customer.Orders。之后,您可以使用Linq查询上下文。 请查看此示例,其中介绍了您需要的内容。http://msdn.microsoft.com/en-us/library/bb425822.aspx

但是你可以声明上下文:

public partial class Northwind : DataContext
{
   public Table<Customer> Customers;
   public Table<Order> Orders;
   public Northwind(string connection): base(connection) {}
}

您应该定义您的Customer类,如:

[Table(Name="Customers")]
public class Customer
{
   [Column(Id=true)]
   public string CustomerID;
   ...
   private EntitySet<Order> _Orders;
   [Association(Storage="_Orders", OtherKey="CustomerID")]
   public EntitySet<Order> Orders {
      get { return this._Orders; }
      set { this._Orders.Assign(value); }
   }
}

然后你可以像其他答案一样查询它。