选择一个项目的 Linq 代码

我发现自己编写了很多这样的代码来选择一个匹配的项目

var item = (from x in Items where x.Id == 123 select x).First();

有没有更简洁的方法,还是这就是我要说的简明扼要?

编辑: 应该说“使用 linq 语法的更干净的方法”。我已经知道了 lambda 语法,看起来这是唯一的方法。不过我确实得到了一些有用的信息,所以谢谢每一个回复的人。

227871 次浏览

FirstOrDefault SingleOrDefault可能很有用,这取决于您的场景,以及您是否希望处理零个匹配项或多个匹配项:

FirstOrDefault: Returns the first element of a sequence, or a default value if no element is found.

SingleOrDefault: 返回序列的唯一元素或默认值 如果序列为空,则该方法引发异常 there is more than one element in the sequence

我不知道这在 linq‘ from’查询中是如何工作的,但是在 lambda 语法中,它看起来是这样的:

var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);

These are the preferred methods:

var item = Items.SingleOrDefault(x => x.Id == 123);

或者

var item = Items.Single(x => x.Id == 123);

取决于您有多喜欢 linq 查询语法,您可以直接使用扩展方法,比如:

var item = Items.First(i => i.Id == 123);

如果您不想在列表为空时抛出错误,那么使用返回元素类型(引用类型为 null)的默认值的 FirstOrDefault:

var item = Items.FirstOrDefault(i => i.Id == 123);


if (item != null)
{
// found it
}

Single()SingleOrDefault()也可以使用,但是如果你正在从数据库或其他已经保证唯一性的东西读取,我不会打扰,因为它必须扫描列表,看看是否有任何重复和抛出。First()FirstOrDefault()在第一场比赛停止,所以他们更有效率。

First()Single()家族中,他们在这里抛出:

  • 如果空/未找到则抛出,如果重复则不抛出
  • FirstOrDefault() - returns default if empty/not found, does not throw if duplicate
  • 如果空/未找到,则抛出; 如果存在重复,则抛出
  • SingleOrDefault() - returns default if empty/not found, throws if duplicate exists

您可以使用扩展方法语法:

var item = Items.Select(x => x.Id == 123).FirstOrDefault();

除此之外,我不确定如果不编写您自己的专门的“ First”和“ FirstOrDefault”扩展方法,您还能得到多少更简洁的内容。

最好能浓缩成这样。

var item = Items.First(x => x.Id == 123);

您的查询当前正在收集枚举数中的所有结果(可能不止一个) ,然后从 那个集中获取第一个结果,完成超出必要的工作。

Single/SingleOrDefault 值得使用,但只有在您希望遍历整个集合并除了选择匹配之外验证匹配是唯一的时候才值得使用。First/FirstOrDefault 将只接受第一个匹配并离开,而不管实际存在多少重复。

只是为了让某人的生活更容易,使用 lambda 表达式的 linq 查询

(from x in Items where x.Id == 123 select x).FirstOrDefault();

确实会导致 SQL 查询带有 里面有 select top (1)

我来告诉你什么对我管用:

int id = int.Parse(insertItem.OwnerTableView.DataKeyValues[insertItem.ItemIndex]["id_usuario"].ToString());


var query = user.First(x => x.id_usuario == id);
tbUsername.Text = query.username;
tbEmail.Text = query.email;
tbPassword.Text = query.password;

我的 id 就是我想要查询的行,在这个例子中,我从 radGrid 获得它,然后我用它来查询,但是这个查询返回一行,然后你可以把你从查询得到的值分配到文本框,或者任何东西,我必须把它们分配到文本框。