就我而言,我还收到了与 lambda_method 相关的异常:
System.NullReferenceException occurred
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=Anonymously Hosted DynamicMethods Assembly
StackTrace:
at lambda_method(Closure , InspectionAsset )
at System.Linq.Enumerable.<>c__DisplayClass6_0`1.<CombinePredicates>b__0(TSource x)
at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at AssetManagement.Model.Repositories.AssetDataService.<LoadOtherAssetsFromTrackAsset>d__18.MoveNext() in C:\src\AssetManagement\AssetManagement.Model\Repositories\AssetDataService.cs:line 135
InnerException:
对我来说,我最初是这样构建数据的,但query = query.Where(filter); 发生了异常:
using Nito.AsyncEx;
// ...
private static readonly AsyncLock _assetsMutext = new AsyncLock();
public List<Expression<Func<sset, bool>>> Filters { get; } = new List<Expression<Func<Asset, bool>>>();
// ...
public async Task<IQueryable<Asset>> LoadAssetsOnTrack(IList<Asset> trackAssets, List<Asset> assets)
{
IQueryable<IAsset> query = null;
await Task.Run(async () =>
{
using (await _assetsMutext.LockAsync())
{
var equipmentList = this.GetEquipment();
Parallel.ForEach(trackAssets, (asset, state) =>
{
if (!AssetRepository.GetIsAssetTrackType(asset.TypeCode))
{
var equipment = equipmentList.Where(x => x.AssetID == asset.AssetID).FirstOrDefault();
var inspectionAsset = new Asset()
{
AssetID = equipment?.AssetID,
Description = equipment?.Description,
// ...
};
// ...
assets.Add(inspectionAsset);
}
});
query = assets.AsQueryable();
foreach (var filter in Filters)
{
query = query.Where(filter);
}
}
});
return query;
}
为了消除异常,我将函数更改为:
public async Task<IQueryable<Asset>> LoadAssetsOnTrack(IList<Asset> trackAssets, List<Asset> assets)
{
IQueryable<IAsset> query = assets.AsQueryable();
foreach (var filter in Filters)
{
query = query.Where(filter);
}
await Task.Run(async () =>
{
using (await _assetsMutext.LockAsync())
{
var equipmentList = this.GetEquipment();
foreach (var asset in trackAssets)
{
if (!AssetRepository.GetIsAssetTrackType(asset.TypeCode))
{
var equipment = equipmentList.Where(x => x.AssetID== asset.AssetID).FirstOrDefault();
var inspectionAsset = new Asset()
{
AssetID = equipment?.AssetID,
Description = equipment?.Description,
// ...
};
// ...
assets.Add(inspectionAsset);
}
}
}
});
return query;
}
也就是说,我仍然不完全清楚为什么我会偶尔在函数的顶部版本中得到异常,而不是在底部版本中得到它。如果有人有任何进一步的见解,请告诉我。