1

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

外汇。我有一个表,列“ID”和“名称”

ID 是自动递增的主键。名称只是 varchar(255)

像这样的 linq 的结果:

from item in db.ItemSet
where item.ID == 1
select item

我留下了一个 IQueryable。但是只能有 1 项,“ID”==1 我如何告诉 linq 这个。

目前我这样做

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

但我会认为这是一个“黑客”......

4

4 回答 4

3

如果您只期待一个,请使用单个

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

实际上,您可以清理更多并执行此操作;

db.ItemSet.Single(item.ID == 1);
于 2012-08-29T12:49:01.670 回答
3

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

但是,它们都假定记录存在,如果没有找到记录,则会抛出异常。如果有可能查找不存在的记录,您可能需要考虑.FirstOrDefault()/ .SingleOrDefault()

进一步阅读:

于 2012-08-29T12:49:06.100 回答
2

使用SingleOrDefaultSingle

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

来自 MSDN 的单曲

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

由于主键不能重复,因此您可以使用Single,因为如果结果集中存在多个值,则会引发异常。

如果您只想要一个或结果,您可以使用SingleOrDefault 。onenone

编辑:至于使 LINQ 知道主键:

from item in db.ItemSet
where item.ID == 1
select item

您不能让 LINQ 返回单个类型的项目ItemSet。虽然 ID 是主键,但 LINQ 是针对一个集合进行查询,并且将返回一个集合而不是单个类型的项目ItemSet

于 2012-08-29T12:49:08.043 回答
0

在您的类声明中,您可以使用 KeyAttribute 构造函数。请参阅:http: //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.keyattribute.aspx

于 2012-08-29T12:53:22.417 回答