[英]c# linq to sql - moving around FirstOrDefault() at end of linq breaks query
下面的两段代码有什么区别?
这将返回我期望的数据。
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();
}
输出(注意查询完全相同):
SELECT TOP(1)[t0]。[ProductId],[t0]。[Name] FROM [dbo]。[Products] AS [t0] WHERE [t0]。[ProductId] = @ p0-@ p0:输入Int (大小= -1;精度= 0;比例= 0)[1]-上下文:SqlProvider(Sql2008)模型:AttributedMetaModel构建:4.0.30319.1
SELECT TOP(1)[t0]。[ProductId],[t0]。[Name] FROM [dbo]。[Products] AS [t0] WHERE [t0]。[ProductId] = @ p0-@ p0:输入Int (大小= -1;精度= 0;比例= 0)[1]-上下文:SqlProvider(Sql2008)模型:AttributedMetaModel构建: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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.