繁体   English   中英

LINQ Group by带有Where子句的子句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM