Linq代码选择一个项目
本文关键字:一个 项目 代码 选择 Linq | 更新日期: 2023-09-27 18:11:49
我发现自己写了很多这样的代码来选择一个与匹配的项目
var item = (from x in Items where x.Id == 123 select x).First();
有没有一种更干净的方法来做这件事,或者这件事像我要做的那样简洁?
编辑:应该说"更干净的方式使用linq语法"。我已经知道lambda语法了,而且看起来这实际上是唯一的方法。不过,我确实得到了一些有用的信息,所以感谢所有回复的人。
根据您对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
。