代码之家  ›  专栏  ›  技术社区  ›  Joe Pitz

在group by上具有Count()的LinqtoSql预编译查询问题

  •  0
  • Joe Pitz  · 技术社区  · 16 年前

    var unorderedc =
                from insp in sq.Inspections
                where insp.TestTimeStamp > dStartTime && insp.TestTimeStamp < dEndTime
                    && insp.Model == "EP" && insp.TestResults != "P"
                group insp by new { insp.TestResults, insp.FailStep } into grp
    
                select new
                {
    
                    FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
                    CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
                    grp.Key.TestResults,
                    grp.Key.FailStep,
                    PercentFailed = Convert.ToDecimal(1.0 * grp.Count() / tcount * 100)
    
                };
    

    我已创建此委托:

    public static readonly Funct<SQLDataDataContext, int, string, string, DateTime, DateTime, IQueryable<CalcFailedTestResult>>
        GetInspData = CompiledQuery.Compile((SQLDataDataContext sq, int tcount, string strModel, string strTest, DateTime dStartTime,
        DateTime dEndTime, IQueryable<CalcFailedTestResult> CalcFailed) =>
        from insp in sq.Inspections
                where insp.TestTimeStamp > dStartTime && insp.TestTimeStamp < dEndTime
                    && insp.Model == strModel && insp.TestResults != strTest
                group insp by new { insp.TestResults, insp.FailStep } into grp
                select new 
                {
                    FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
                    CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
                    grp.Key.TestResults,
                    grp.Key.FailStep,
                    PercentFailed = Convert.ToDecimal(1.0 * grp.Count() / tcount * 100)
                });
    

    语法错误在CompileQuery.Compile()语句中

    在我编写的其他预编译查询中,我只能自己使用select投影。在这种情况下,我需要执行grp.count()和立即if逻辑。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Nick Craver    16 年前

    简而言之,您不能对匿名类型使用CompliedQuery,您需要让查询返回一个命名类型,因此

    select new 
            {
                FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
                CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
                grp.Key.TestResults,
                grp.Key.FailStep,
                PercentFailed = Convert.ToDecimal(1.0 * grp.Count() / tcount * 100)
            }
    

    select new MyType
            {
                FailedCount = (grp.Key.TestResults == "F" ? grp.Count() : 0),
                CancelCount = (grp.Key.TestResults == "C" ? grp.Count() : 0),
                TestResults = grp.Key.TestResults,
                FailStep = grp.Key.FailStep,
                PercentFailed = Convert.ToDecimal(1.0 * grp.Count() / tcount * 100)
            }
    

    你的最后一个泛型参数 Func<> IQueryable<MyType> 同样,因为这就是您的查询现在返回的结果。

    在这种情况下, MyType 看起来像:

    public class MyType {
      public int FailedCount { get; set; }
      public int CancelCount { get; set; }
      public string TestResults { get; set; }
      public string FailStep { get; set; } //Unsure of type here
      public decimal PercentFailed { get; set; }
    }