我在C#中遇到LINQ的问题,这个问题已经发生了很多次。问题出在lambda函数周围,我从列表中选择超时或将其用于评估以将该项目返回。
这种情况是,我在这里有一个已定义的对象列表,我想搜索这些对象的属性,其中某些属性是列表。因此,它们是一个对象列表,其中包含列表,在这里我需要返回内部列表项。
在代码示例中,如您所见,我在每个并行示例中都包含了此内容。我只包括正在执行的行。因此,如果我取出布尔值评估(y => y.ProductName),则可以正常工作。这不是第一次发生这种问题,lambda本身内部的某些东西导致了某种形式的Field Access Exception,这是通过在评估和放入字符串本身时起作用的。
以下是例外情况本身:
System.FieldAccessException:通过方法尝试 '<> x + <> c__DisplayClass0_0。<<> m0> b__1(FinanceService.Models.BusinessRules.Calculations.BenefitCalculatedModel)' 访问字段 'FinanceService.Excel.Helper.InvoiceHelper + <> c__DisplayClass2_1.CS $ <> 8__locals1' 失败了在 <> x。<> c__DisplayClass0_0。<<> m0> b__1(BenefitCalculatedModel y)在 System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
奇怪的是,当包裹在try-catch块中时,这不会引发错误,并且捕获了Exception对象类型。在调试模式下评估代码时,我只能找到这个。
是否有其他人使用Linq函数遇到了这种问题?这是我编写代码的方式的错误还是出于某些奇怪的原因而使.Net出现问题?
此问题的解决方案/解决方案是执行另一个并行的foreach循环并直接写出评估以找到它,而不仅仅是使用lambda。
目前正在使用.Net Framework v4.6.1在Windows 10盒中编写此文件
奇怪的是,这取决于字符串值或它周围的东西如何“一致”。在其他情况下,如果我说寻找x ==“ ABC”可以工作,但是x == variable不能工作,尽管variable ==“ ABC”返回的是一个真实的语句,所以任何一个都可以工作。
验证所有变量都可以公开访问。
bool category = false;
//ProductCategory is a string
//ProductName is a string
//y in this case is a string, where x is an object
Parallel.ForEach(_calculatedGroup, b =>
{
List<string> charges = b.Charges.Values.SelectMany(x => x.Select(y => category ? y.ProductCategory : y.ProductName)).Distinct().ToList();
});
应该始终使用Linq函数返回在ProductCategory或ProductName中提供的不同字符串的列表
答案 0 :(得分:0)
可能的副本:This Question about the same exception
这里最可能的问题是未将ProductCategory,Values或Charges设置为公共。