c# linq to sql - 在 linq break query() 末尾移动 FirstOrDefault()

本文关键字:linq 移动 FirstOrDefault break sql to query | 更新日期: 2023-09-27 17:56:54

下面的两段代码有什么区别?

这将返回我期望的数据。

return productTable.FirstOrDefault(p => p.ProductId == productId);

这不....

return productTable.Where(x => x.ProductId == productId).FirstOrDefault();

我主要只是想知道这两者之间是否存在逻辑差异。

c# linq to sql - 在 linq break query() 末尾移动 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();
    }
}