我们正在实现一些EF数据存储库,我们有一些查询包括 TOP 1
我已经阅读了许多建议使用.Take(1)
我正在审查的代码使用的帖子.First()
我知道这两个都会为对象赋值产生相同的结果,但它们是否实际上都解析为同一个查询?查询数据库时,它实际上是否同时TOP 1用于两个请求?或者他们会将查询完整地执行到可枚举中,然后只需获取集合中的第一个条目?
此外,如果我们使用.FirstOrDefault()那么为什么我们应该期待任何不同的行为?我知道,当使用一个IEnumerable,调用一个.First()在一个空的集合会抛出,但如果这是实际上只更改查询包括TOP 1话,我应该会完全没有功能上的差异之间.First()和.FirstOrDefault()....对不对?
或者,是否有比这些Enumerable扩展更好的方法来执行查询TOP 1?
这个答案引起的讨论让我很好奇.哪个更快:
someEnumerable.Single(predicate);
Run Code Online (Sandbox Code Playgroud)
要么
someEnumerable.Where(predicate).Single();
Run Code Online (Sandbox Code Playgroud)
毕竟,第一个更短,更简洁,似乎是专门建造的.
甚至ReSharper建议前者:

我在上一篇文章中争论说,它们在功能上是相同的,并且应该具有非常相似的运行时.
Linq中的Compare方法允许您通过IEqualityComparer查找,但我找不到允许您通过同一个比较器检索项目的对应方法.
这真的是最好的方法吗?
MyItem myFinderItem = new MyItem(keyField1, keyField2);
if (myList.Contains(myFinderItem, new MyEqualityComparer()))
{
MyItem myRealItem = myList.Single(item => new MyEqualityComparer().Equals(item , myFinderItem));
}
Run Code Online (Sandbox Code Playgroud)
(我正在通过调用Except Linq方法分享IEqualityComaprer的用法,我想维护一个单一来源进行相等比较)
编辑:我正在寻找具有签名的方法:
T Find<T>(T t, IEqualityComparer<T> comparer)
Run Code Online (Sandbox Code Playgroud)
编辑2:我想这很有效,它很时髦.但它太可怕了,永远不会用它 :(
myList.Intersect( new List<MyItem>{myFinderItem}, comparer).Single();
Run Code Online (Sandbox Code Playgroud) 我有一个类 points.cs 有成员:
public class Points
{
public int Id = 0;
public string Name { get; set; }
}
I have a list of these points like this `List<Points> list= new List<Points>();`
Run Code Online (Sandbox Code Playgroud)
现在这个列表对象包含数据:
列表:
Id Name
1 abc
2 def
3 ghi
4 jkl
Run Code Online (Sandbox Code Playgroud)
我要做的是使用列表对象中的 LINQ 查询获取与我的代码中提供的 ID 号相对应的名称。
我的尝试显然是错误的:
string nameFetchedId=list.Select(Name).Where(obj=>obj.Id=2) //result returned will be "def"
Run Code Online (Sandbox Code Playgroud)
请纠正我,我不擅长 LINQ?