2

LINQ にメソッドがあります 基本的に、LINQ クエリが行うことは、データベースからデータを取得することです。

ユーザーは 2 つの日付から選択して、それら 2 つの日付の間のデータを取得できます。しかし、ユーザーがデータのない日付範囲を選択すると、次のエラーが表示されます。

具体化された値が null であるため、値型 'Double' へのキャストが失敗しました。結果の型のジェネリック パラメーターまたはクエリのいずれかで、null 許容型を使用する必要があります

データがなくても、ユーザーが 2 つの日付の間で検索しても問題ないはずです。Visual Studio で受け取ったこのエラーではなく、これらの日付の間にデータがないというエラー メッセージが表示されるはずです。最初に MVC エンティティ フレームワーク モデルを使用しています。

メソッドは次のとおりです。

public List<CoreValueAndAverageGrade> GetAverageGradeForAllCoreValues(
    OfficeStatisticQueryViewModel model)
{
    var StartDate = DateTime.Parse(model.StartDate);
    var EndDate = DateTime.Parse(model.EndDate);

    return db.CoreValue
        .Where(v => v.CoreValueQuestion
            .Any(q => !q.SubjectType.Ignored_Statistic))
        .Select(coreValue => new CoreValueAndAverageGrade
        {
            CoreValue = coreValue,
            AverageGrade = coreValue.CoreValueQuestion
                .Where(q => !q.SubjectType.Ignored_Statistic)
                .Average(q => q.SelectedQuestions
                    .Where(s => 
                        s.GoalCardQuestionAnswer != null
                        && s.GoalCardQuestionAnswer.Grade.HasValue
                        && s.GoalCard.Completed_Date >= StartDate
                        && s.GoalCard.Completed_Date <= EndDate
                        )
                    .Average(s => s.GoalCardQuestionAnswer.Grade.Value))
        })
        .ToList();
}

更新: Grade is Doubleand Nullable

どんな種類の助けも大歓迎です!

前もって感謝します!

4

3 に答える 3

1

クエリの最後の部分を見ると、where句でフィルタリングした後に返される行がない場合s.GoalCardQuestionAnswer.Grade.Value、null であるオブジェクトのプロパティにアクセスしようとしているため、間違いなくスローされます。

コードをこれに変更すると、最終値として 0 が得られると思います。コードでこの値を明示的に確認する必要があります。

.Average(s => s != null ? s.GoalCardQuestionAnswer.Grade.Value : 0)

それ以外の場合は、クエリを分割することをお勧めします。これは、デバッグとコードの読みやすさの両方に役立ちます。

于 2012-05-14T18:38:23.913 に答える
0

クエリを分割してさらに調査します。私の推測では、一貫性のないデータがいくつかあると思います。doubleおそらく、 aと aを比較しdouble?double?値が nullになる場所で発生します。実際にはそこにあるはずのnullのレコードを確認してください。

于 2012-05-14T10:27:50.853 に答える