2012-01-02 71 views
0

我需要帮助来理解linq连接。我发现了与这个问题有关的几个主题,但我没有找到一个有很好解释的步骤。以实体框架加入linq

我正常的查询,我这样做。

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

in 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但对于这个“选择新的”?它是否被称为数据库中的每个记录?

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

在对象的情况下,是第一台,如果我需要有一个未在这种类型的,我的意思是新ATTR定义的数据会发生什么。

其他问题,当查询执行?

而且,这种方法很好的响应速度或更好的解决方案?

thx提前。如果有一个线程与这个答案plz指向我很好。

回答

2

in q.ToList() its get executed the query, right?

what about this "select new" ? is it called for each record in the DB ?

新只是一个新的匿名对象,查询通常跑了反对你的表。

what type is that object? anyone i want or is order because is the first table in the query?

是匿名的,你可以做select new Order {不过,如果你已经定义了一个Order类。

in case of the object is the first table, what happens if i need to have data that is not defined in this type of, i mean new attr.

你将不得不选择它或属性/属性添加到您的对象/类。

other question, when is the query executed?

在foreach循环

also, is this method good for response speed or are better solutions?

是的,这很好

+0

你告诉我的是正确的。现在我得到了一个例子的错误。与ON表明它说,顺序和细节是不正确的与平等,但与他们的工作表明他们的工作是正确的。任何线索? – 2012-01-03 15:22:35

+0

错误:名称“订单”不在“等于”左侧的区域内。改变'equals'两边的表达式。 – 2012-01-03 15:34:05

+0

如果有人在意,事情就是这个顺序在这里。我是在平等的左边放置细节,并且必须继续下去。 – 2012-01-03 16:32:00

1

Select new正在创建一个匿名类型,你可以把你从两个表到它希望的任何领域。
你可以做一些阅读在这里:
http://msdn.microsoft.com/en-us/library/bb397696.aspx

当你使用它的结果时,执行查询时,它可以当你迭代(的foreach)发生在其上,或当你调用toList(),指定者()或其他任何东西。

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