Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OrderBy是如何应用的?_C#_.net_Linq_Entity Framework - Fatal编程技术网

C# OrderBy是如何应用的?

C# OrderBy是如何应用的?,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我有以下疑问: var vendors = (from pp in this.ProductPricings join pic in this.ProductItemCompanies on pp.CompanyId equals pic.CompanyId into left from pic in left.DefaultIfEmpty() orderby pp.Effec

我有以下疑问:

var vendors = (from pp in this.ProductPricings
               join pic in this.ProductItemCompanies
               on pp.CompanyId equals pic.CompanyId into left
               from pic in left.DefaultIfEmpty()
               orderby pp.EffectiveDate descending
               group pp by new { pp.Company, SortOrder = (pic != null) ? pic.SortOrder : short.MinValue } into v
               select v).OrderBy(z => z.Key.SortOrder);
有人知道最后一个
OrderBy()
是如何应用的吗?这是SQL查询的一部分,还是所有结果都加载到内存中,然后传递到
OrderBy()

如果是第二种情况,有没有办法让它成为一个查询?我只需要第一项,返回所有结果将非常低效。

它将尝试将
OrderBy
应用于原始查询,因为您仍在使用
IQueryable
——这意味着它尚未转换为
IEnumerable
,也未使用
ToList
或相当于


它是否可以取决于结果查询的复杂性。你得试试看。我猜它会将主查询变成子查询,并在
“SELECT*FROM(…)ORDER BY SortOrder”
外部查询上分层。

根据您的具体示例,在这种情况下,ORDER BY最有可能在生成时作为表达式树的一部分应用,因此,它将应用于LINQ查询生成的sql,如果您将其转换为Enumerable,如另一个答案中提到的ToList,则Order by将作为Enumerable的扩展应用

可能会使用可读代码,因为在编写时它是不可理解的。 您将来会遇到linq语句的问题。问题是,如果您的语句不返回任何值,则该值将为null,并且无论何时,只要您创建一个异常,该值都将为null

你必须小心。
我建议您单独做每件事来理解代码朋友。

看看像EFProfiler这样的工具,它会告诉您生成的查询是什么样子的。您没有枚举,所以我的理解是order by将成为生成的SQL语句的一部分。生成的SQL应该告诉您发生了什么。DBMS可能会执行您试图避免的操作,即返回所有结果,然后对其进行排序。如果查询足够复杂,那么SQLServer将对查询执行多线程处理,然后在返回结果集之前必须对整个结果集重新排序,因为我认为您错了。我没有看到任何地方可以在这里引发null异常。你…吗?我也不知道你觉得有什么不可读。你的代码和我的一样。你有更好的写作方法吗?我是凭经验说话的。我使用LINQtoSQL,这是我的问题。可重新编码的代码很容易理解。这并不是说我有答案,朋友。好吧,谢谢。但你两个问题都没有回答。我从你的评论中没有有用的信息。我认为你对空异常的理解是错误的。但我愿意让你告诉我我错了。