Dan*_*nte 22 .net c# linq linq-to-sql
我正在学习LINQ-to-SQL,一切都很顺利,直到发生奇怪的事情:
我试着做一个例子distinct,所以,使用Northwind dabatase我写了以下查询:
var query =
from o in db.Orders
orderby o.CustomerID
select new
{
o.CustomerID
};
Run Code Online (Sandbox Code Playgroud)
如果我打印LINQ-to-SQL为其中存储的查询生成的SQL,query则如下所示:
SELECT [t0].[CustomerID]
FROM [dbo].[Orders] AS [t0]
ORDER BY [t0].[CustomerID]
Run Code Online (Sandbox Code Playgroud)
所以,像往常一样,查询把所有的CustomerID每一个Order中Orders按字母顺序排序表.
但!如果我使用这样的Distinct()方法:
var query = (
from o in db.Orders
orderby o.CustomerID
select new
{
o.CustomerID
}).Distinct();
Run Code Online (Sandbox Code Playgroud)
该查询带来了该Distinct子句的预期结果,但是CustomerID尽管我写了,但是没有订购orderby o.CustomerID!
第二个LINQ查询的SQL查询如下:
SELECT DISTINCT [t0].[CustomerID]
FROM [dbo].[Orders] AS [t0]
Run Code Online (Sandbox Code Playgroud)
我们可以看到**该ORDER BY条款缺失.这是为什么?
ORDER BY当我使用该Distinct()方法时,为什么该子句会消失?
Joa*_*son 38
预期的行为是它返回源中唯一项的无序序列.
换句话说,当你使用Distinct()它时,现有IQueryable的任何顺序都会丢失.
你想要的可能是更像这样的东西,在Distinct()完成之后的OrderBy();
var query = (from o in db.Orders
select new
{
o.CustomerID
}).Distinct().OrderBy(x => x.CustomerID);
Run Code Online (Sandbox Code Playgroud)
Kei*_*thS 15
尝试重新排列成员以在Distinct之后放置OrderBy.你必须恢复方法链:
db.Orders.Select(o=>o.CustomerId).Distinct().OrderBy(id=>id);
Run Code Online (Sandbox Code Playgroud)
无论如何,这将是在Enumerable Linq中设置查询的更有效方式,因为OrderBy将仅对唯一项而不是对所有项进行操作.另外,根据MSDN,Enumerable.Distinct无论如何都不保证元素的返回顺序,因此在重复删除之前的排序是没有意义的.