.ToList()之间的好处.第一个()经文.单独用于c#中的IQueryable

for*_*ect 1 c# linq nosql

所以我在一个NOSQL数据库上运行一个linq查询,该数据库只返回一个对象,如果一个对象存在,或者什么都不存在则没有,但是数据库中有两个具有相同id的对象(如果有人搞砸了) .)目前我实现如下:

(from c in [IQueryableThing] where c.Id.Equals(id)).ToList().First()
Run Code Online (Sandbox Code Playgroud)

我也考虑过替代方案

(from c in [IQueryableThing] where c.Id.Equals(id)).Single()
Run Code Online (Sandbox Code Playgroud)

我假设.Single()更快但我担心这些都不会处理数据库中没有正确id的对象的情况.我不在乎是否有多人退回.我只想要其中一个.最终我会实现一些东西来返回最近修改过的东西.

基本上我的问题是什么是解决将可查询转换为单个实例的问题的最佳方法,该方法处理没有具有正确id的对象且具有正确id的多个对象的情况.

SLa*_*aks 13

这听起来像你只想打电话FirstOrDefault(),这正是名字所暗示的.
Default手段null.

你不应该打电话ToList(); 这将不必要地从数据库下载所有结果.

  • @inquisitiveIdiot:如果您确实想通过网络下载整个结果并将其保存在内存中,则只应调用“ToList()”。 (2认同)

p.s*_*w.g 5

使用IQueryable.Single效率更高:

  • 调用将ToList枚举整个结果集,并将每个项目存储在内存中的单个连续数组中。在First随后只是需要从数组的第一个项目。
  • 调用IQueryable.Single仅评估列表中的第一项,如果没有返回任何项,则引发异常。然后,它检查结果集中是否还有其他项目,如果有则抛出异常。

如果您想处理集合中不存在符合您条件的项目,但又不在乎是否有多个项目,我强烈建议您FirstOrDefault改用:

var result = (from c in [IQueryableThing] where c.Id.Equals(id)).FirstOrDefault();
if (result == null)
{
    // no items found
}
Run Code Online (Sandbox Code Playgroud)

这将转换为TOP 1SQL中的a,并仅返回结果集中的第一项,或者如果结果集为空,则将简单地返回null(如果要处理结构,则返回默认值)。