LINQ の問題が発生しました。問題を解決するためにご協力いただければ幸いです。
これが何が起こっているかです。
IQueryable<LicenseEntity>
リポジトリからエンティティを取得します。- これらのエンティティのフィールドを確認すると、有効なデータが含まれていることがわかります。
Customer
LicenseEntity には関連エンティティのフィールドがあります。LicenseEntity を使用してロードしたため、有効なデータも含まれています。 .Select
各 LicenseEntity を LicenseViewModel に投影するために使用します。- 各 LicenseEntity に対して、LicenseEntity が渡され
AutoMapper.Mapper.Map
、LicenceViewModel エンティティに読み込まれます。 - すべてのエンティティが処理された後、デバッガーで LicenseViewModels のリストを見ると、null 参照例外が報告され、表示する項目がありません。
- AutoMapper が私の問題を引き起こしているかどうかを判断するために、
MapMe()
. MapMe の return ステートメントで停止しs
、元のエンティティであるパラメーターを調べたところ、顧客フィールドが null になっていることを除いて、その中のデータは問題ないことがわかりました。それSelect
は私が知らない何かをしたと思います。
Select
プロジェクションを実行しているときに、元のエンティティのすべての情報を保持するにはどうすればよいですか? 私たちのソリューションでは、リストが非常に大きくなる可能性があるため、リストを具体化できません。以下にテスト コードを記載しました。ご協力をお願いいたします。
// Get the IQueryable<LicenseEntity> list of licenses from the repository.
var list = LicenseRepository.List();
// Convert the IQueryable<LicenseEntity> to an IQueryable<LicenseViewModel>
var vmlist = list.Select(x => MapMe(x, new LicenseViewModel()));
//var vmlist = list.Select(x => AutoMapper.Mapper.Map(x, new LicenseViewModel()));
// This function was used to see the LicenseEntity that was passing into Map().
// I discovered that the entity has all the correct data except for a related
// entity field, which was present in the original LicenseEntity before
public LicenseViewModel MapMe(LicenseEntity s, LicenseViewModel d)
{
return d;
}
次のコードは適切に機能しますが、エンティティを具体化することはできません。
List<LicenseViewModel> vms = new List<LicenseViewModel>();
foreach (var item in list)
{
var vm = AutoMapper.Mapper.Map(item, new LicenseViewModel());
vms.Add(vm);
}