我有一个小问题。如何让linq意识到某些列是独一无二的
FX。我有一个表,列“ID”和“名称”
ID是自动递增主键。名称只是varchar(255)
像这样的linq的结果:
from item in db.ItemSet
where item.ID == 1
select item
我留下了IQueryable。但是只能有一个项目,“ID”== 1 我怎么告诉linq这个。
目前我这样做
(from item in db.ItemSet
where item.ID == 1
select item).First()
但我认为这是“黑客”......
答案 0 :(得分:3)
如果您只想要一个,请使用单个
(from item in db.ItemSet
where item.ID == 1
select item).Single()
事实上你可以清理更多并做到这一点;
db.ItemSet.Single(item.ID == 1);
答案 1 :(得分:3)
您可以使用.Single()
代替.First()
。
但是,这两个都假定记录存在,并且如果没有找到记录则会抛出异常。如果有可能查找不存在的记录,您可能需要考虑.FirstOrDefault()
/ .SingleOrDefault()
。
进一步阅读:
答案 2 :(得分:2)
使用SingleOrDefault
或Single
var result = db.ItemSet.Single(r=>r.ID == 1);
返回序列的唯一元素,如果出现异常则抛出异常 序列中没有一个元素。
由于主键不能重复,因此可以使用Single
,因为如果结果集中有多个值,则会抛出异常。
如果您只想要one
或none
结果,则可以使用SingleOrDefault。
编辑:至于让LINQ知道主键:
from item in db.ItemSet
where item.ID == 1
select item
您不能让LINQ返回ItemSet
类型的单个项目。虽然ID是主键,但LINQ正在查询集合,并且将返回集合而不是单个ItemSet
项
答案 3 :(得分:0)
在类声明中,您可以使用KeyAttribute构造函数。请参阅:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.keyattribute.aspx