如何使用LINQ仅查询数据库中的单个项目?

时间:2009-04-08 08:17:40

标签: linq

我想获得一个LINQ-to-SQL查询,它只返回一个项目,而不是它们的集合?

例如,我有一个具有特定名称的产品列表。数据库中没有具有重复名称的产品,因此我希望能够查询并返回该产品的该实例。

Products product = from p in _productContext.Products 
                   where p.name.Equals("BrownShoes") 
                   select p;

我该怎么做?

5 个答案:

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