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