8
recordsList.ListOfRecords = new StudentRecordsBAL()
                                .GetStudentsList()
                                .Select(q => new StudentRecords()
            {
                _RollNumber = q._RollNumber,
                _Class = q._Class,
                _Name = q._Name,
                _Address = q._Address,
                _City = q._City,
                _State = q._State,
                _Subjects = q._Subject,
                _AttendedDays = new AttendanceBAL()
                                    .GetAttendanceListOf(q._RollNumber)
                                    .Where(date => date != null)
                                    .Select(date => 
                                        new DateTime(date._Date.Year, date._Date.Month, date._Date.Day))
                                    .Distinct()
                                    .ToList(),
                _AttendedSubjects = GetAttendedSubjects(q._RollNumber)                                            
        }).ToList(); 

上記のコードのメソッドはGetAttendanceListOf(q._RollNumber)、データベースからレコードのリストを返すか、渡された「roll-no」にレコードが存在しない場合は「null」を返します。linq クエリは終了し、エラーが発生します

「値を null にすることはできません」。

このエラーを処理して LINQ を次のステップにジャンプさせる方法はありますか?

4

5 に答える 5

10
_AttendedDays = new AttendanceBAL()
    .GetAttendanceListOf(q._RollNumber)
    .Where(date => date != null)
    .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day))
    .Distinct()
    .ToList(),

問題は、Where()null インスタンスでの実行にあります。可能な解決策:

1)GetAttendanceListOf出席がない場合は空のリストを返すように変更します (一般的に良い考えです。null オブジェクト パターンは非常に多くの場合命の恩人であり、コレクションの場合、空のコレクションは意味的に null に似ていることが多いためです)
2) 制御しない場合そのメソッドで、null の場合に空のリストを返す安全な拡張メソッドを記述します。

List<AttendanceType> SafeAttendanceList(this AttendanceBALType bal, RollNumber rn)
{
    return bal.GetAttendanceListOf(rn) ?? new List<AttendanceType>();
}

次に、次のように呼び出します。

_AttendedDays = new AttendanceBAL()
    .SafeAttendanceListOf(q._RollNumber)
    .Where(date => date != null)
于 2013-04-11T12:12:21.047 に答える
0

結果がない場合、Linq ToList() は空のリストを返します。エラーは別の場所から発生している可能性があります。

メソッドを使用してオブジェクトを作成することをお勧めします。これにより、クエリが読みやすくなり、デバッグしやすくなります。null になっているものと、実行に失敗した正確な場所を特定するために、複数の手順で実行することをお勧めします。

エラーは GetAttendanceListOf() から発生する可能性があります。メソッドが IList または IEnumerable を返す場合、結果がない場合は空のリストを返す必要があります。null かどうかを毎回検証することができなくなります。

于 2013-04-11T12:13:02.357 に答える
0

あなたが試すことができます

recordsList.ListOfRecords = new StudentRecordsBAL().GetStudentsList().Select(q => 
            {
                var attendanceList = new AttendanceBAL().GetAttendanceListOf(q._RollNumber);
                if (attendanceList == null)
                    return null;
                return new StudentRecords()
                    {
                        _RollNumber = q._RollNumber,
                        _Class = q._Class,
                        _Name = q._Name,
                        _Address = q._Address,
                        _City = q._City,
                        _State = q._State,
                        _Subjects = q._Subject,
                        _AttendedDays = attendanceList.Where(date => date != null).Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)).Distinct().ToList(),
                        _AttendedSubjects = GetAttendedSubjects(q._RollNumber)
                    };
            }).Where(q => q != null).ToList(); 

これにより、null オブジェクトに対して操作を行っていないことが確認Whereされ、null の結果が除外されます。

于 2013-04-11T12:14:45.137 に答える
0

簡単に修正するには、この行を変更します

_AttendedDays = new AttendanceBAL().GetAttendanceListOf(q._RollNumber).Where...

これに

_AttendedDays = (new AttendanceBAL().GetAttendanceListOf(q._RollNumber) ??new List() ).どこで...

于 2013-04-11T12:33:03.250 に答える
0

@Zdeslav Vojkovic で提案されGetAttendanceListOfているように、null の場合は空のリストを返すように変更するか、次のようにします。

_AttendedDays = (新しい出席BAL()
    .GetAttendanceListOf(q._RollNumber) ?? Enumerator.Empty<レコードの種類>())
    .Where(日付 => 日付 != null)
    .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day))
    。明確()
    .ToList()、

(余分な括弧なしでそれを行うことができるかもしれません)

于 2013-04-11T12:26:38.887 に答える