【问题标题】:Select data from 3 tables with Linq to SQL使用 Linq to SQL 从 3 个表中选择数据
【发布时间】:2015-08-04 10:24:05
【问题描述】:

我有 3 张桌子。订单、订单项和订单项服务。每个订单可以包含多个 OrderItem,每个 OrderItem 可以包含多个 OrderItemService。 我想从 Linq 中的这些表中获取所有订单的数据列表。我可以编写一个连接,但是如何在 select clasue 中创建一个匿名数据类型,它可以给我这个层次结构中的订单列表?

如果我使用导航属性,然后在下面显示的侧边选择子句中选择 OrderItemServices,它将触发我想要避免的每个 OrderItemService 的单独选择查询。

from order in Orders
select new
{
    ActiveOrders = order,
    ActiveOrderItems =order.OrderItems,
    ActiveServices = order.OrderItems.Select(o => o.OrderItemServices)
}

是否可以将每个订单与其内部的多个项目和多个服务的结构组合在一起?

【问题讨论】:

  • 所以你想避免使用连接?
  • 我认为 OP 正在寻找分层数据集,而不是“扁平化”数据集。
  • 我不想回避。我不想像上面的查询那样触发 OrderItems 和 OrderItemServices 的单独查询。

标签: c# .net linq


【解决方案1】:

请参阅msdn 以开始使用 LINQ To SQL

要从三个表中获取数据,您可以从以下简单示例中获得灵感

var data = (from product in context.Products
           from department in context.Departments
           from category in context.Categories
           where product.DeptId == department.DeptId
           && product.CatId == category.CatId
           select new 
           {
               product.Code,
               product.Name,
               department.Name,
               category.Name
           }).Distinct.ToList();

【讨论】:

  • 此示例适用于 1:1 关系。我在表格中有一个 1 到 N 的关系
【解决方案2】:

您必须设置您的上下文以使用预先加载:

var context = new MyDataContext();
var options = new DataLoadOptions();
options.LoadWith<Orders>(x => x.OrderItems);
options.LoadWith<OrderItems>(x => x.OrderItemServices);
context.LoadOptions = options;

var query = from order in context.Orders // ... etc

然后子项将包含在初始查询结果中,不会导致对数据库的额外请求。这将在内部使用JOIN 一次性检索所有数据。您可以使用 SQL Server Profiler 检查生成的 SQL。

http://blog.stevensanderson.com/2007/12/02/linq-to-sql-lazy-and-eager-loading-hiccups/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多