C# 对group by使用Count()的LinqtoSql预编译查询问题

C# 对group by使用Count()的LinqtoSql预编译查询问题,c#,linq-to-sql,precompiled,C#,Linq To Sql,Precompiled,有一个我现在想要预编译的LinqtoSql查询 var unorderedc = from insp in sq.Inspections where insp.TestTimeStamp > dStartTime && insp.TestTimeStamp < dEndTime && insp.Model == "EP" && insp.TestResult

有一个我现在想要预编译的LinqtoSql查询

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)

            };
var无序c=
sq.检查中的督察
其中insp.TestTimeStamp>dstartime&&insp.TestTimeStamp
我已创建此委托:

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)
            });
公共静态只读函数
GetInspData=CompiledQuery.Compile((SQLDataContext sq,int-tcount,string-strModel,string-strTest,DateTime-dstartime,
DateTime dEndTime,IQueryable CalcFailed)=>
sq.检查中的督察
其中insp.TestTimeStamp>dstartime&&insp.TestTimeStamp
语法错误在CompileQuery.Compile()语句中

它似乎与select new{}语法的使用有关。 在我编写的其他预编译查询中,我只能自己使用select投影。在本例中,我需要执行grp.count()和立即if逻辑


我搜索了SO和其他引用,但找不到答案。

简而言之,您不能对匿名类型进行复杂查询,您需要让查询返回命名类型,以便

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
看起来像:

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; }
}

感谢Nick,这很管用,但似乎对可以传递给已编译查询的类型数量有限制。我不得不做更多的挖掘来解决这个问题。一旦我解决了这个问题,查询就可以正常编译了。