让linq知道唯一ID

时间:2012-08-29 12:47:52

标签: c# linq

我有一个小问题。如何让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()

但我认为这是“黑客”......

4 个答案:

答案 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)

使用SingleOrDefaultSingle

var result = db.ItemSet.Single(r=>r.ID == 1);

Single from MSDN

  

返回序列的唯一元素,如果出现异常则抛出异常   序列中没有一个元素。

由于主键不能重复,因此可以使用Single,因为如果结果集中有多个值,则会抛出异常。

如果您只想要onenone结果,则可以使用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