C# LINQ在小表上执行查询时速度非常慢
我试图从一个有1K-2K记录的表中执行一个简单的查询,由于某种原因,它需要10秒以上的时间。 查询的结构是:C# LINQ在小表上执行查询时速度非常慢,c#,linq,foreach,C#,Linq,Foreach,我试图从一个有1K-2K记录的表中执行一个简单的查询,由于某种原因,它需要10秒以上的时间。 查询的结构是: using (context) { context.ObjectTrackingEnabled = false; foreach (Object _object in _objectSet) { foreach (QueryFilter _filte
using (context)
{
context.ObjectTrackingEnabled = false;
foreach (Object _object in _objectSet)
{
foreach (QueryFilter _filter in _fList)
{
try
{
Object2 object2 = precompiledQuery(context, _filter.var1, _filter.var2, _filter.var3, _filter.var4);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
break;
}
}
}
外部对象列表是另一个查询的结果。QueryFilter是为WHERE语句指定值的自定义对象,我认为这相当于在SQL中使用嵌套的IN语句 预编译查询需要4-5毫秒(当它匹配记录时)到30-60毫秒(当它返回null时) 你注意到什么不对劲了吗 编辑:
- 对象集大小范围在10-200个元素之间
- 过滤器列表大小范围在1-3个元素之间
- 预编译查询通过
调用终止,因此它返回一条记录Single()
- 这不是一个共享上下文,我只是为这个操作创建了这个上下文
public static Func<LinqToSqlDataContext, int, int, bool, string, int, string, Action>
GetRelativeAction =
CompiledQuery.Compile((LinqToSqlDataContext db, int IDhand, int idp, bool isHero, string street, int br, string action) => (from r in dm.Actions
where (r.IDH == IDhand && r.Street.CompareTo(street)==0 &&
r.BetRound == br && r.Action1.CompareTo(action)==0 && r.Hero == isHero)
select r).Single());
公共静态函数
获得相对反应=
CompiledQuery.Compile((LinqToSqlDataContext db,int-IDhand,int-idp,bool-isHero,string-street,int-br,string-action)=>(从dm.Actions中的r开始)
其中(r.IDH==IDhand和r.Street.CompareTo(Street)==0和
r、 BetRound==br&&r.action 1.比较(action)==0&&r.Hero==isHero)
选择r.Single());
您有索引吗?有!但在我看来,这个问题与我的LINQ代码密切相关,我曾尝试从SQL MANAGEMENT STUDIO使用纯SQL进行查询,查询速度非常快,至少快了10倍。您的对象集有多大?fList中有多少个过滤器?预编译查询到底在做什么?(返回IQueryable?或者它是否评估查询?)最后,您是否使用共享上下文?“搜索所有内容时30-60毫秒”非常快,是吗?如果预编译查询执行查询,那么您将执行一个简单的查询多次,执行的次数在这里会有所帮助。