web-dev-qa-db-ja.com

linqでnull値を処理する方法は?

_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を次のステップにジャンプさせる方法はありますか?

8
Gautam G
__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(),
_

問題は、nullインスタンスでWhere()を実行することです。可能な解決策:

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)
_
10

簡単に修正するには、この行を変更してください

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

これに

_AttendedDays =(new AttendanceBAL()。GetAttendanceListOf(q._RollNumber)?? new List())。Where ...

0
Mat J

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

メソッドを使用してオブジェクトを作成することをお勧めします。これにより、クエリが読みやすくなり、デバッグしやすくなります。何がnullになり、どこで正確に実行できないかを判断するために、複数のステップで実行することをお勧めします。

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

0
JCorriveau

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

 _ AttendedDays =(new AttendanceBAL()
 .GetAttendanceListOf(q._RollNumber)?? Enumerator.Empty <typeofrecord>())
 .Where(date => date!= null )
 .Select(date => new DateTime(date._Date.Year、date._Date.Month、date._Date.Day))
 .Distinct()
。ToList ()、

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

0
Eli Algranti

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

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の結果を除外します。

0
Cornelius