繁体   English   中英

c#linq到sql-在linq末尾绕过FirstOrDefault()中断查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM