1

我在 C# 中遇到了 LINQ 的问题,这个问题已经出现过多次。问题在于我从列表中选择时间或使用它进行评估以返回该项目的 lambda 函数。

场景是我有一个我定义的对象列表,我想搜索这些对象的属性,其中一些属性是列表。所以它们是一个对象列表,其中包含列表,我需要在其中返回内部列表项。

如您所见,在代码示例中,我在每个并行中都有这个。我只包括正在影响的线路。因此,如果我取出布尔评估( y=> y.ProductName ),这将毫无问题。这不是第一次发生这种问题,lambda 本身内部的某些东西导致了某种字段访问异常,通过在评估和放入字符串本身时它起作用。

这是异常本身:

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 循环并直接写出评估以找到它,而不仅仅是使用 lambdas。

目前使用 .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 中提供的不同字符串列表

4

1 回答 1

0

可能重复:This Question about the same exception

这里最可能的问题是 ProductCategory、Values 或 Charges 未设置为公开。

于 2019-04-22T22:31:08.977 回答