C# LINQ在小表上执行查询时速度非常慢

C# LINQ在小表上执行查询时速度非常慢,c#,linq,foreach,C#,Linq,Foreach,我试图从一个有1K-2K记录的表中执行一个简单的查询,由于某种原因,它需要10秒以上的时间。 查询的结构是: using (context) { context.ObjectTrackingEnabled = false; foreach (Object _object in _objectSet) { foreach (QueryFilter _filte

我试图从一个有1K-2K记录的表中执行一个简单的查询,由于某种原因,它需要10秒以上的时间。 查询的结构是:

        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()
    调用终止,因此它返回一条记录
  • 这不是一个共享上下文,我只是为这个操作创建了这个上下文
编辑2:

    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毫秒”非常快,是吗?如果预编译查询执行查询,那么您将执行一个简单的查询多次,执行的次数在这里会有所帮助。