Linq代码选择一个项目

时间:2011-10-18 15:26:23

标签: c# linq

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

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

是否有一种更清洁的方式可以做到这一点,还是像我将要的那样简洁?

编辑:应该说“使用linq语法的清洁方式”。我已经知道了lambda语法,它开始看起来这实际上是唯一的方法。我确实得到了一些有用的信息,所以感谢所有回复的人。

7 个答案:

答案 0 :(得分:159)

取决于您对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(),但如果您正在从数据库或已经保证唯一性的内容中读取内容,我不会打扰,因为它必须扫描列表以查看是否有任何内容重复和抛出。 <{1}}和First()在第一场比赛中停止,因此效率更高。

FirstOrDefault()First()家庭中,这里是他们扔的地方:

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

答案 1 :(得分:15)

FirstOrDefaultSingleOrDefault可能会有用,具体取决于您的方案,以及您是否要处理零或多个匹配项:

  

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

     

SingleOrDefault:返回序列的唯一元素或默认值   序列为空时的值;如果这个方法抛出异常   

中有多个元素

我不知道这是如何在linq'from'查询中运行的,但在lambda语法中它看起来像这样:

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

答案 2 :(得分:10)

这些是首选方法:

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

或者

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

答案 3 :(得分:9)

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

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

确实导致带有的SQL查询 其中select top (1)

答案 4 :(得分:7)

这可以更好地归结为此。

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

您的查询当前正在收集可枚举内的所有结果(并且可能有多个),然后从 设置中获取第一个结果,执行的操作超出必要的范围。

Single / SingleOrDefault是值得的,但只有当你想要遍历整个集合并验证匹配是唯一的,除了选择匹配。 First / FirstOrDefault只会进行第一场比赛并离开,无论实际存在多少重复。

答案 5 :(得分:4)

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

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

除此之外,我不确定你能得到多少简洁,而不用编写自己专门的“First”和“FirstOrDefault”扩展方法。

答案 6 :(得分: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获取它,然后我用它来查询,但是这个查询返回一行,然后你可以将你从查询中获得的值分配给textbox或者其他什么,我必须将它们分配给文本框。