使用实体框架加入linq

时间:2012-01-02 15:50:24

标签: c# linq entity-framework

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

我正常查询,我这样做。

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但是这个&#34;选择新的&#34; ?它是否为数据库中的每条记录调用?

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

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

其他问题,查询何时执行?

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

提前thx。如果有一个帖子有这个答案,那么请指点我。

2 个答案:

答案 0 :(得分:2)

  

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

  

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

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

  

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

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

  

如果对象是第一个表,如果需要,会发生什么   有这种类型的数据,我的意思是新的attr。

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

  

其他问题,查询何时执行?

在foreach循环中

  

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

是的,没关系

答案 1 :(得分:1)

Select new正在创建一个匿名类型,您可以将两个表中您想要的任何字段放入其中 你可以在这里阅读一下:
http://msdn.microsoft.com/en-us/library/bb397696.aspx

只要你使用它的结果就会执行查询,它可以在你对它进行迭代(foreach)时,或者在你调用toList(),toArray()或其他任何东西时发生。

此方法对响应速度非常有用。 与任何生成的SQL一样,它可能会根据您的使用情况进行优化,但除非您拥有非常大量的数据,否则它就足够了。 否则,您必须编写存储过程,并将其映射到实体框架