Linq代码来select一个项目

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

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

有没有更干净的方法呢,还是这样简洁呢?

编辑:应该说“使用linq语法更清洁的方式”。 我已经意识到了lambda语法,它开始看起来像这是实际上唯一的方法。 虽然我收到了一些有用的信息,所以感谢大家的回复。

取决于你喜欢linq查询语法多less,你可以直接使用扩展方法:

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

如果列表为空时不想抛出错误,则使用FirstOrDefault ,它返回元素types的默认值(对于引用types为null ):

 var item = Items.FirstOrDefault(i => i.Id == 123); if (item != null) { // found it } 

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

First()Single()系列中,这里是他们抛出的地方:

  • First() – 如果为空/未find则抛​​出,如果重复则抛出
  • FirstOrDefault() – 如果为空/未find则返回缺省值,如果重复则不返回
  • Single() – 如果为空/未find则抛​​出,如果存在重复则抛出
  • SingleOrDefault() – 如果为空/未find则返回缺省值,如果有重复则返回

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

FirstOrDefault:返回序列的第一个元素,如果没有find元素,则返回默认值。

SingleOrDefault:返回序列的唯一元素,如果序列为空,则返回默认值; 如果序列中有多个元素,则此方法将引发exception

我不知道这是如何工作在一个LINQ'从'查询,但在lambda语法它看起来像这样:

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

这些是首选的方法:

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

要么

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

这可以更好地压缩到这一点。

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

您的查询目前正在收集所有结果(可能有多个),然后从集合中获取第一个结果, 从而做了比必要的更多的工作。

Single / SingleOrDefault是值得的,但只有当你想遍历整个集合,并validation匹配是唯一的,除了select匹配。 First / FirstOrDefault只需要第一个匹配并离开,而不pipe实际存在多less重复。

只是为了让别人的生活更轻松,lambdaexpression式的linq查询

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

确实会产生一个SQL查询,其中包含select top (1)

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

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

除此之外,我不确定你可以得到多less简明扼要,而不需要编写自己专门的“First”和“FirstOrDefault”扩展方法。

我会告诉你什么对我有用:

 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得到它,然后我用它来查询,但是这个查询返回一行,那么你可以分配从查询得到的值到文本框,或任何东西,我不得不将它们分配给文本框。