【问题标题】:EF 4 CTP 5 Complex queryEF 4 CTP 5 复杂查询
【发布时间】:2011-02-17 11:12:54
【问题描述】:

我有一个类似下面的模型:

public class Customer
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }

    public DateTime DateTime { get; set; }

    public Customer Customer { get; set; }

    public ICollection<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    public int Id { get; set; }

    public Product Product { get; set; }

    public int Price { get; set; }

    public int Quantity { get; set; }
}

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }

    public Category Category { get; set; }
}

public class Category
{
    public int Id { get; set; }

    public string Name { get; set; }
}

我正在使用this infrastructure

我的聚合根是客户、订单、产品。我没有在此处包含映射,因为它们是直截了当的。

var customers = unitOfWork.Customers.FindAll();
var orders = unitOfWork.Orders.FindAll();
var products = unitOfWork.Products.FindAll();

var query = ......

使用 LINQ,您将如何选择所有订购“饮料”类别产品的客户?

我在网上看到的所有示例都是非常基本的查询,没有什么高级的。

【问题讨论】:

  • 您的产品没有分类信息。
  • 产品对类别的引用在哪里?

标签: entity-framework entity-framework-4 code-first ef-code-first entity-framework-ctp5


【解决方案1】:

我找到了http://msdn.microsoft.com/en-us/vbasic/bb737909

您的查询可能如下所示:

from c in unitOfWork.Customers
join o in unitOfWork.Orders on o.Customer = c
join ol in unitOfWork.OrderLines on ol.Order = o
where ol.Product.Category.Name == "Beverages"
select c

并且需要添加所有的父对象属性

【讨论】:

  • 这不会产生交叉连接吗?不过还是要试试。 .
  • Orderline 没有 Order 属性,所以这个“在 ol.Order = o 上的 unitOfWork.OrderLines 中加入 ol”将不起作用
  • 它需要添加所有父对象属性
  • 没有父属性有什么办法吗?
  • 如果没有父属性,您不能使用联接。在这种情况下,您必须创建单独的查询。它的令人不安和更多的代码
【解决方案2】:

这可能有效或无效:

from customer in customers
where customer.Orders.Any(
      o => o.OrderLines.Any(l => l.Product.Category.Name == "Beverages")
select customer

(我假设你忘记了 Product 和 Category 之间的关系)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多