2012-08-29 35 views
1

我有一个小问题。我如何让linq意识到某些列是唯一的让linq知道uniqe ID

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() 

不过,我会认为这是一个 “黑客” ......

+2

由于'ID'是主键,它*已经知道*;例如,LINQ-to-SQL将(对于你已经显示的'。First()'用法)尝试通过身份缓存进行查找,以节省往返时间。 –

回答

3

你可以使用.Single(),而不是.First()

但是,这两者都假定记录存在,并且如果没有记录被发现将抛出异常。如果有可能查找不存在的记录,则可能需要考虑.FirstOrDefault()/.SingleOrDefault()

延伸阅读:

+0

您提供的[codeproject link](http://www.codeproject.com/Articles/72475/LINQ-Single-vs-First)上的奇怪比较。首先出租车或我的单车,如果有更多,例外。咦? –

+0

你说得对,有点尴尬。猜猜他是要从标准人员/员工的例子中找出一些变化...... –

3

如果你只希望一个,使用单

(from item in db.ItemSet 
where item.ID == 1 
select item).Single() 

事实上,你可以清理更多,并做到这一点;

db.ItemSet.Single(item.ID == 1); 
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