加入Linq的最佳方法

9

我曾经使用下面的第一种方法,但后来发现了第二种方法并想知道它们之间的区别和哪个更好。

以下是两种方法的区别:

from a in this.dataContext.reglements
join b in this.dataContext.Clients on a.Id_client equals b.Id 
select...

并且。
from a in this.dataContext.reglements
from b in this.dataContext.Clients
where a.Id_client == b.Id 
select...
2个回答

6
我创建了一个测试用例来测试差异,在您的场景中它们是相同的。
我的测试示例使用AdventureWorks,但基本上存在以下关联:
产品->类别ID->类别
var q = (
    from p in Products
    from c in Categories
        where p.CategoryID==c.CategoryID
    select p
);

q.ToList();

生成以下SQL语句:

SELECT [t0].[ProductID], [t0].[ProductName], [t0].[CategoryID]
    FROM [Products] AS [t0], [Categories] AS [t1]
WHERE [t0].[CategoryID] = ([t1].[CategoryID])

var q2 = (
    from p in Products 
    join c in Categories 
        on p.CategoryID equals c.CategoryID
    select p);

q2.ToList();

产生以下 SQL:
SELECT [t0].[ProductID], [t0].[ProductName], [t0].[CategoryID]
FROM [Products] AS [t0]
INNER JOIN [Categories] AS [t1] ON [t0].[CategoryID] = ([t1].[CategoryID])

第二个是否会翻译成 ANSI 风格的连接?为什么要在内存中进行?这也是有效的 SQL,对吧? - Esteban Araya
你确定吗?LINQ to SQL 没有特别的理由不能在 SQL 中生成多个 FROM 子句。 - Adam Robinson
@Esteban:那不是“ANSI风格”的连接;那是一种遗留的连接方式,因为JOIN子句在近10年前被引入到ANSI SQL-92规范中。 - Adam Robinson
@Adam:感谢澄清。所以“pre-ANSI风格”是正确的,对吗? - Esteban Araya
@Adam 现在正在设置一个 linq2sql 测试以查看输出。我之前用数据服务做了一个,它执行了一个 select many,然后是一个 where。 - Nix
@Esteban:不,它们都是“ANSI风格” :) 这两种语法都是合法的ANSI SQL,尽管多部分的FROM(较旧的样式)在我所知道的范围内已经被弃用了。 - Adam Robinson

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接