我正在学习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表。但是,我不明白如何让它发挥作用!
答案 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); }
}
}
然后你可以像其他答案一样查询它。