下面的两段代码有什么区别?
这将返回我期望的数据。
return productTable.FirstOrDefault(p => p.ProductId == productId);
这不....
return productTable.Where(x => x.ProductId == productId).FirstOrDefault();
我主要只是想知道这两者之间是否存在逻辑差异。
这些查询应该基本相同。 FirstOrDefault()
的无参数版本仅获取查询中可用的第一条记录,如果没有可用的记录,则获取默认值(即 null)。
编辑 2 正如评论中适当指出的那样,我应该使用 LINQ-to-SQL。 下面是使用 LINQ-to-SQL 的示例:
using (ProductsDataContext context = new ProductsDataContext())
{
context.Log = Console.Out;
var p1 = context.Products.FirstOrDefault(p => p.ProductId == 1);
var p2 = context.Products.Where(p => p.ProductId == 1).FirstOrDefault();
}
输出(请注意查询完全相同):
选择顶部 (1) [t0]。[产品编号], [t0]。[名称]来自 [DBO]。[产品]如 [t0]其中 [t0]。[产品 ID] = @p0 -- @p0:输入 int(大小 = -1;Prec = 0;比例 = 0) [1] -- 上下文:SqlProvider(Sql2008) 模型:属性元模型构建: 4.0.30319.1
选择顶部 (1) [t0]。[产品编号], [t0]。[名称]来自 [DBO]。[产品]如 [t0]其中 [t0]。[产品 ID] = @p0 -- @p0:输入 int(大小 = -1;Prec = 0;比例 = 0) [1] -- 上下文:SqlProvider(Sql2008) 模型:属性元模型构建: 4.0.30319.1
编辑:这是示例代码来证明它们是同一件事:
class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Product> productTable = new List<Product> {
new Product { ProductId = 123, Name = "Cheese" },
new Product { ProductId = 456, Name = "Milk" },
};
var r1 = productTable.FirstOrDefault(p => p.ProductId == 123);
var r2 = productTable.Where(p => p.ProductId == 123).FirstOrDefault();
// these print out the same thing
Console.WriteLine(r1.Name);
Console.WriteLine(r2.Name);
Console.ReadLine();
}
}