【问题标题】:Select 2 elements with linq使用 linq 选择 2 个元素
【发布时间】:2017-03-13 10:07:20
【问题描述】:

我需要在一个带有 linq 的表中选择 2 个城市:

解决方案 1:只有一个查询

            var CityQuery = db.Cities.Where(c => c.CityId == City1Id || c.CityId == City2Id).Take(2)
                foreach (var item in CityQuery)
            {
                if (item.CityId == City1Id)
                { 
                    City1Name = item.CityName;
                }
                else
                {
                    City2Name = item.CityName;
                }
            }

解决方案 2:执行 2 个查询

            var City1Query = db.Cities.Where(c => c.CityId == City1Id).FirsOrDefault();
            City1Name = City1Query.CityName;
            var City2Query = db.Cities.Where(c => c.CityId == City2Id).FirsOrDefault();
            City2Name = City2Query.CityName;

哪个查询最有效?最佳做法是什么?

【问题讨论】:

  • 如果你想要最快的,你可以使用秒表来检查执行时间:)
  • 第二个需要两次往返数据库,几乎可以肯定,这会比第一个慢。但是,这里有很多因素在起作用(索引与全表扫描等),因此唯一确定的方法是测量。还;对于其他一系列因素,这可能会因具体情况而有很大差异。
  • 第一个是否会“扫描”所有数据库以尝试找到所有可能的结果?
  • 优于秒表,可以使用 BenchmarkDotnet:github.com/dotnet/BenchmarkDotNet。我认为 RobIII 也是如此。
  • 奇怪的是,“FirstOrDefault”在缺少“t”时会变成蓝色

标签: c# sql-server performance linq


【解决方案1】:

一般来说,您的解决方案 1 应该更快,因为它只需要一次往返数据库。但是,这种差异是否显着取决于您的用例。

这是一个替代解决方案,它只从数据库中取回城市名称(而不是取回所有列)。乍一看,这可能看起来像是一个低效的笛卡尔积,但 db 引擎很可能会对此进行优化,尤其是在 CityId 列上存在索引的情况下。

var result = from city1 in CityQuery where city1.CityId == City1Id
             from city2 in CityQuery where city2.CityId == City2Id
             select new 
             {
                 City1Name = c1.CityName, 
                 City2Name = c2.CityName
             };

City1Name = result.City1Name;
City2Name = result.City2Name;

【讨论】:

  • 我刚刚对我的数据库进行了秒表测试,解决方案 1 在我的环境中更快。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2011-08-31
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多