【问题标题】:join in linq with entity framework使用实体框架加入 linq
【发布时间】:2012-01-02 15:50:23
【问题描述】:

我需要帮助来了解 linq 加入。我发现了一些与此问题相关的主题,但我没有找到一个对步骤有很好解释的主题。

我正常查询,我这样做。

var q = from c in context.tableA
        select c;
        List<tableA> tableAList = q.ToList();

在 q.ToList() 中它会执行查询,对吗?

here 找到了一些例子,但我想澄清这一点,

 using (AdventureWorksEntities context = new AdventureWorksEntities())
 {
 ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
 ObjectSet<SalesOrderDetail> details = context.SalesOrderDetails;

var query =
    from order in orders
    join detail in details
    on order.SalesOrderID equals detail.SalesOrderID
    where order.OnlineOrderFlag == true
    && order.OrderDate.Month == 8
    select new
    {
        SalesOrderID = order.SalesOrderID,
        SalesOrderDetailID = detail.SalesOrderDetailID,
        OrderDate = order.OrderDate,
        ProductID = detail.ProductID
    };

foreach (var order in query)
{
    Console.WriteLine("{0}\t{1}\t{2:d}\t{3}",
        order.SalesOrderID,
        order.SalesOrderDetailID,
        order.OrderDate,
        order.ProductID);
}
}

所以从这个例子中我可以看到查询可以有超过 1 个 objetc,但是这个“select new”呢?是否为数据库中的每条记录调用?

那个对象是什么类型的?我想要或正在订购的任何人,因为是查询中的第一个表?

如果对象是第一个表,如果我需要没有在这种类型中定义的数据会发生什么,我的意思是新的属性。

其他问题,查询什么时候执行?

另外,这种方法对响应速度有好处还是更好的解决方案?

提前谢谢。如果有这个答案的线程请指出我。

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    在 q.ToList() 中它会执行查询,对吗?

    是的

    这个“选择新的”怎么样?是否为数据库中的每条记录调用 ?

    new 只是一个新的匿名对象,查询是针对您的表正常运行的。

    那个对象是什么类型的?我想要或订购的任何人,因为是 查询中的第一个表?

    它是匿名的,但如果您定义了 Order 类,您可以使用 select new Order {

    如果对象是第一个表,如果我需要怎么办 有没有在这种类型中定义的数据,我的意思是新的属性。

    您必须选择它或将属性/属性添加到您的对象/类中。

    其他问题,查询什么时候执行?

    在foreach循环中

    另外,这种方法对响应速度有好处还是更好的解决方案?

    是的,没关系

    【讨论】:

    • 你告诉我的是正确的。现在我在示例中遇到错误。在 ON 语句中,它表示顺序和细节在 equals 中是不正确的,但在 where 语句中它们工作正确。有什么线索吗?
    • 错误:名称“order”不在“equals”左侧区域内。更改 'equals' 两边的表达式。
    • 如果有人关心,问题是这里的顺序很重要。我把细节放在equals的左边,必须放在右边。
    【解决方案2】:

    Select new 正在创建一个匿名类型,您可以将两个表中所需的任何字段放入其中。
    您可以在此处阅读相关内容:
    http://msdn.microsoft.com/en-us/library/bb397696.aspx

    查询会在你使用它的结果时执行,它可以在你迭代(foreach)它时发生,或者当你调用 toList()、toArray() 或任何时候发生。

    这种方法对响应速度比较好。 与任何生成的 SQL 一样,它可能可以根据您的用例进行优化,但除非您拥有非常大量的数据,否则完全足够了。 否则,您必须编写一个存储过程,并将其映射到实体框架

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-07
      • 2018-11-30
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多