[英]LINQ Group by Clause with Where clause
我正在学习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表可能尚未加载。 但是,我不知道如何使其工作!
您的对象之间的关系应正确配置。 如果您使用的是实体框架,只需将“ Customers
实体中的Orders
属性标记为virtual
这将允许延迟加载。 然后,您的查询将简单得多。 否则,您仍然可以从Orders
开始,而不是从Customers
:
var customers = ctx.Orders.GroupBy(c => c.CustomerID)
.Where(x => x.Count() > 20)
.SelectMany(g => g.Select(o => o.Customer));
对于客户(带有virtual
Orders集合)而言,非常简单:
var customers = ctx.Customers.Where(c => c.Orders.Count() > 20);
如果客户和订单相关(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));
您可以执行以下操作:
var customers = from c in Customers where c.Orders.Count() > 20 select c;
customers.GroupBy(o => o.CustomerID);
尝试使用join..into子句之类的东西
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;
为了写这样的查询,您需要使用数据库关系(Navigation属性)。 此关系应在您的上下文中声明为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); }
}
}
然后您可以像其他答案一样查询它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.