Linq代码选择一个项目

本文关键字:一个 项目 代码 选择 Linq | 更新日期: 2023-09-27 18:11:49

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

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

有没有一种更干净的方法来做这件事,或者这件事像我要做的那样简洁?

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

Linq代码选择一个项目

根据您对linq查询语法的喜爱程度,您可以直接使用扩展方法,如:

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

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

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

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

First()Single()家族中,以下是它们的投掷位置:

  • First()-如果为空/未找到则抛出,如果重复则不抛出
  • FirstOrDefault()-如果为空/未找到则返回默认值,如果重复则不抛出
  • Single()-如果为空/未找到则抛出,如果存在重复则抛出
  • SingleOrDefault()-如果为空/未找到则返回默认值,如果存在重复则抛出

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

FirstOrDefault:返回序列的第一个元素,如果找不到元素,则返回默认值。

SingleOrDefault:返回序列的唯一元素或默认值值,如果序列为空;如果序列中有不止一个元素

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

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

为了让某人的生活更轻松,使用lambda表达式的linq查询

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

确实导致SQL查询select top (1)

以下是首选方法:

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是值得的,但前提是您希望遍历整个集合,并在选择匹配项的同时验证匹配项是否唯一。First/FirstOrDefault将只进行第一场比赛并离开,而不管实际存在多少重复项。

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

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

除此之外,我不确定如果不编写自己专门的"First"answers"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获得它,然后我用它来查询,但这个查询返回一行,然后你可以将从查询中获得的值分配给textbox,或者任何事情,我必须将这些值分配给text box。

如果您没有该表的特定Id,并且需要匹配多个条件才能获得唯一值,我们可以这样做,

var item = Items.
      .Where(x => x.Name== "Name you are looking for")
      .Where(x => x.Status == 1)
      .FirstOrDefault();

如果条件匹配,这将返回Items中的第一个元素。如果您确信Items由一个唯一的元素组成,我们可以使用FirstOrDefault((,因为它会更快。

我们也可以使用SingleOrDefault()FirstOrDefault(),但在返回值之前,它将继续查找第二个相同的元素。如果我们查询一个大的数据库表,这可能会造成一些延迟。如果我们确信该列表是唯一的,那么最好使用FirstOrDefault