关于LINQ最高性能方法的想法

3
我有一个表,总共有350448条记录,我需要使用LINQ和Entity Framework执行多个重复查询。这些重复查询的数量大约是1440次,我无法修改数据库。
从性能方面来说,最好的方法是什么:
  • 选择所有350448条记录并在客户端上查询它们
  • 对数据库执行1440个查询
  • 首先尝试缩小数据范围,然后在客户端上执行查询
我基本上需要查找1440个项目,但我意识到可能会出现性能问题。

1
一个查询1440个项目并不等同于进行1440次查询,请提供更多信息。 - Jon Skeet
我有一个包含1440个DateTime的列表需要查找并返回值。我看不到其他方法,只能每次执行一个查询? - m.edmondson
@m.edmonson:这些批次是否匹配精确值? - Jon Skeet
最好的方法是将这1440个值上传到SQL Server,可以使用表变量(仅限2008版本)或临时表,然后针对包含这1440个值的表运行一个查询 - 但我不知道如何使用EF实现。 - J Cooper
@m.edmondson:但这是一个精确匹配,我的意思是?不是某种不等式测试之类的吗? - Jon Skeet
显示剩余2条评论
1个回答

0

听起来你可能可以这样做:

List<DateTime> dates = ...;
var query = context.MyEntities
                   .Where(x => dates.Contains(x.LastUpdated))
                   .ToList();

然而:

  • 我不确定 EF 是否像 LINQ to SQL 一样支持 Contains
  • 你可能需要将查询分成几个批次;这取决于 EF 是否足够聪明以使用表值参数(以及你的数据库是否支持它)。

一次返回1440条记录的查询批处理将比1440个查询批处理更快。 - Filip De Vos
@m.edmondson:我期望它是好的,是的。为什么不试一下看看它是否a)能够工作和b)足够好呢? - Jon Skeet
@m.edmondson:它可以与Entity Framework一起使用,但不幸的是,“Contains”被认为是非常慢的,特别是如果“dates”列表有“许多”条目:https://dev59.com/Y2sz5IYBdhLWcg3wHUMU#8108643 - Slauma
它会很慢,没错,但比进行1440个单独查询要快得多。它会尽可能快。 - Niels Brinch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接