_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を次のステップにジャンプさせる方法はありますか?
__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)
_
簡単に修正するには、この行を変更してください
_AttendedDays = new AttendanceBAL()。GetAttendanceListOf(q._RollNumber).Where .. ..
これに
_AttendedDays =(new AttendanceBAL()。GetAttendanceListOf(q._RollNumber)?? new List())。Where ...
結果がない場合、Linq ToList()は空のリストを返します。エラーは他の場所から発生している可能性があります。
メソッドを使用してオブジェクトを作成することをお勧めします。これにより、クエリが読みやすくなり、デバッグしやすくなります。何がnullになり、どこで正確に実行できないかを判断するために、複数のステップで実行することをお勧めします。
エラーはGetAttendanceListOf()から発生する可能性があります。メソッドがIListまたはIEnumerableを返す場合、結果がない場合は空のリストを返す必要があります。これにより、nullかどうかを毎回検証できなくなります。
@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 ()、
(余分な括弧なしでそれを行うことができるかもしれません)
あなたが試すことができます
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の結果を除外します。