0

プリコンパイルしたい 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)

            };

このデリゲートを作成しました:

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 new {} 構文の使用に関連しているようです。私が書いた他のコンパイル済みクエリでは、select プロジェクションを単独で使用する必要がありました。この場合、grp.count() と即時の if ロジックを実行する必要があります。

SO やその他の参考文献を検索しましたが、答えが見つかりません。

4

1 に答える 1

0

つまり、匿名型に対して 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; }
}
于 2010-04-26T23:40:16.060 に答える