我想获得一个LINQ-to-SQL查询,它只返回一个项目,而不是它们的集合?
例如,我有一个具有特定名称的产品列表。数据库中没有具有重复名称的产品,因此我希望能够查询并返回该产品的该实例。
Products product = from p in _productContext.Products
where p.name.Equals("BrownShoes")
select p;
我该怎么做?
答案 0 :(得分:10)
使用Single
:
Product product = _productContext.Products
.Single(p => p.Name == "BrownShoes");
或
Product product = _productContext.Products
.Where(p => p.Name == "BrownShoes")
.Single();
Single没有查询表达式语法,因此您必须将其称为普通扩展方法。此时,您的查询更简单,使用点表示法编写,因此上面的表单。您可以将其写为:
Product product = (from p in _productContext.Products
where p => p.Name == "BrownShoes"
select p).Single();
但是这种情况更加严重。如果结果中没有一个元素,则会抛出异常。
答案 1 :(得分:7)
我建议使用IQueryable.SingleOrDefault()
。如果有多条记录,则IQueryable.SingleOrDefault()
和IQueryable.Single()
会抛出异常,但如果小于,则IQueryable.Single()
也会抛出一条记录。这意味着,如果您要搜索单个记录,并且由于某种原因它不存在,则必须处理异常。
更好的是IQueryable.SingleOrDefault(),因为你只检查null:
var employee = (from e in context.Employees
where e.ID == employeeID
select e).SingleOrDefault();
if (employee == null)
{
// Cope with employee not found
}
// Do stuff with employee
答案 2 :(得分:4)
您需要使用.Single()
或.SingleOrDefault()
:
Products product = (from p in _productContext.Products where p.name.Equals("BrownShoes") select p).Single();
Single()
如果不存在1个产品将抛出异常,SingleOrDefault()
如果不存在则返回null,如果有多个则抛出异常。
答案 3 :(得分:3)
Products product = (from p in _productContext.Products
where p.name.Equals("BrownShoes")
select p).FirstOrDefault();
答案 4 :(得分:1)
如果您确定会找到产品。如果没有找到产品,将抛出异常:
Products product = _productContext.Products
.Single(p => p.name.Equals("BrownShoes"));
或者,如果没有找到产品,产品将为空:
Products product = _productContext.Products
.SingleOrDefault(p => p.name.Equals("BrownShoes"));