linq ,语句是 query = query.OrderByDescending(NewsTj => NewsTj.Id); 为啥不按倒序进行排序呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linq ,语句是 query = query.OrderByDescending(NewsTj => NewsTj.Id); 为啥不按倒序进行排序呢?相关的知识,希望对你有一定的参考价值。

参考技术A OrderByDescending(方法通过使用延迟执行实现。 即时返回值为一个对象,该对象存储执行操作所需的所有信息。 只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的查询。
-----------
以上是官方资料,说的直白一些,你的query可能还没输出,中间结果就被别的操作给覆盖了。
本人倒是有一次出现这样的情况,是因为数据量庞大,延迟处理导致输出序列阶段有效。
----
解决思路:即时输出。
使用ToXXXX() 方法。
------
如果不是以上原因,请放出所有源程序,一句代码不够。本回答被提问者采纳
参考技术B query = query.OrderByDescending(NewsTj => NewsTj.Id).ToList(); 参考技术C 问道“不知

如何在 Linq Query 中执行 If 语句

【中文标题】如何在 Linq Query 中执行 If 语句【英文标题】:How to do If statement in Linq Query 【发布时间】:2010-11-12 07:33:06 【问题描述】:

我目前有一个包含以下内容的列表

CountryCode (string)
CountryStr  (string)
RegionStr   (string)
RegionID    (int)
AreaStr     (string)
AreaID      (int)

这是一组扁平的链接数据(基本上是我存储的联合搜索的结果)

MVC 路由只会传递一个字符串,然后我需要将其与 heirachy 中正确级别的数据进行匹配。 所以我试图查询 CountryStr 如果它没有产生结果,那么该区域然后是该区域;但我需要做一些查询,例如......

 var datURL = (from xs in myList
               //query 1
               where xs.RegionStr == rarREF
               select new
               
                regionID = xs.RegionId,
                CountryID = xs.CountryCd
               
               //IF theres no results 
               where xs.AreaStr == rarREF
               select new
               
                AreaID = xs.AreaID
                regionID = xs.RegionId,
                CountryID = xs.CountryCd
                            
               ).ToList();

我目前看到的唯一方法是分别运行每个查询,然后检查哪些返回值并使用那个。我希望有一个更聪明、更清洁的方法。

【问题讨论】:

【参考方案1】:

阅读起来并不容易,但您可以使用类似这样的方式一次性完成:

var datURL = (from xs in myList
              where xs.RegionStr == rarREF || xs.AreaStr == rarREF
              select new
              
                AreaID = (xs.AreaStr == rarRef ? xs.AreaID : default(int)),
                RegionID = xs.RegionId,
                CountryID = xs.CountryId
              
             ).ToList();

如果稍微重写查询,也可能更容易阅读:

var datURL = (from xs in myList
              let isArea = xs.AreaStr == rarREF
              let isRegion = xs.RegionStr == rarREF
              where isRegion || isArea
              select new
              
                AreaID = (isArea ? (int?)xs.AreaID : null),
                RegionID = xs.RegionId,
                CountryID = xs.CountryId
              
             ).ToList();

如果我们保存比较结果,以后可以重复使用。我还向int? 添加了一个强制转换,以展示如何使用可为空的值而不是使用 0 作为“无区域”值。

【讨论】:

在 çağdaş 中将 null 替换为 default(int) 似乎有点像 Id 期望的那样。那么 where 语句是说如果它没有返回任何结果,请按照我的想法尝试 AreaStr 吗?有了这个,我猜我可以很容易地添加更多:op 我们假设 Region 字符串永远不会匹配 Area 字符串,因此 where 将返回 Region 匹配或 Area 匹配的列表项。然后在选择中,我们再次检查匹配是区域还是区域。我将使用可能更易于阅读的版本进行编辑。 我对这个 linq 百灵鸟所能取得的成就印象深刻。非常甜蜜。感谢您的帮助!【参考方案2】:

您不是在寻找or 运营商吗?这不会产生您想要的结果吗?

var datURL = (from xs in myList
              where xs.RegionStr == rarREF || xs.AreaStr == rarREF
              select new
              
               AreaID = xs.AreaStr == rarREF ? xs.AreaID : default(int)
               regionID = xs.RegionId,
               CountryID = xs.CountryCd
              ).ToList();

【讨论】:

以上是关于linq ,语句是 query = query.OrderByDescending(NewsTj => NewsTj.Id); 为啥不按倒序进行排序呢?的主要内容,如果未能解决你的问题,请参考以下文章

Linq to entity 使用“Func”在生成匿名对象的选择语句中创建属性

从 LINQ 生成的 SQL 不一致

LINQ 学习路程 -- 查询操作 Deferred Execution of LINQ Query 延迟执行

从 Linq Query 调用 SQL 标量函数

LINQ (Language Integrated Query)

linq日期查询