C# linq to sql - 在 linq 末尾移动 FirstOrDefault() 会中断查询

发布于 2024-11-07 15:41:51 字数 293 浏览 0 评论 0原文

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

这会返回我期望的数据......

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

这不会......

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

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

What is the difference between the two pieces of code below?

This returns the data I expect....

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

This doesn't....

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

I'm mainly just wondering if there's a logical difference between these two.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想念有你 2024-11-14 15:41:51

这些查询应该基本相同。无参数版本的 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].[ProductId],
[t0].[名称] FROM [dbo].[产品] AS
[t0] 其中 [t0].[ProductId] = @p0
-- @p0:输入整数(大小 = -1;Prec = 0;比例 = 0)[1]
-- 上下文:SqlProvider(Sql2008) 模型:AttributedMetaModel 构建:
4.0.30319.1

选择顶部 (1) [t0].[ProductId],
[t0].[名称] FROM [dbo].[产品] AS
[t0] 其中 [t0].[ProductId] = @p0
-- @p0:输入整数(大小 = -1;Prec = 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();
    }
}

Those queries should be essentially identical. The parameterless version of FirstOrDefault() just grabs the first record available from the query, or default value (i.e., null) if no records are available.

Edit 2 As duly pointed out in the comments, I should be using LINQ-to-SQL. Here is a sample with 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();
}

Output (notice the queries are exactly identical):

SELECT TOP (1) [t0].[ProductId],
[t0].[Name] FROM [dbo].[Products] AS
[t0] WHERE [t0].[ProductId] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build:
4.0.30319.1

SELECT TOP (1) [t0].[ProductId],
[t0].[Name] FROM [dbo].[Products] AS
[t0] WHERE [t0].[ProductId] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build:
4.0.30319.1

Edit: Here is sample code to demonstrate they are the same thing:

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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文