为什么此LINQ语句在匹配值上遇到错误



我有一个列表"其他fee",我正在使用linq语句,但是当我匹配o.shortname

时,它正在显示错误
 IList <P_OtherFee> otherfee = 
     P_OtherFee.FindByP_ProgramId((int)p_LoanApplication.P_ProgramId);
        int fee = otherfee.Where(o => o.ShortName == 'PROCESSING FEE').Select(o => o);

您将整个IEnumerable<P_OtherFee>对象分配给int变量。您应该过滤列表并从单个对象中检索属性,但要注意它可能是null,如果没有根据条件发现。这是三元运算符的示例,以分配0的默认值,以防OBJ为null

P_OtherFee obj = otherFee.FirstOrDefault(o => o.ShortName == "PROCESSING FEE");
int fee = (obj != null) ? obj.Fee : 0; 

老式的Linq语法可能更简单地阅读和理解:

int fee = (from obj in otherFee 
           where obj.ShortName == "PROCESSING FEE" 
           select obj.Fee).FirstOrDefault();

如果找到了匹配项,则获得一个Fee值,如果没有结果,则获得0。这与以前的代码相同,但可以使您免于编写NULL检查。

在这两种情况下,如果您期望一个结果,并且希望获得一个以上的结果,则可以使用SingleOrDefault(...)而不是FirstOrDefault(...)

,因为您选择了所有对象(o => o)而不是INT属性,所以您无法在fee变量中设置Where子句的结果。

如果要选择一个int:

int fee = otherfee.Select(o => o.intProperty).FirstOrDefault(o => o.ShortName == "PROCESSING FEE");

如果要选择几个INT:

IEnumerable<int> fee = otherfee.Where(o => o.ShortName == "PROCESSING FEE").Select(o => o.intProperty);

正如@sebastian Hofmann提到的那样,您不能使用''声明字符串,您必须使用""

您可以使用Single()/SingleOrDefault()First()/FirstOrDefault()获取fee

var feeObj = otherfee.Single(o => o.ShortName == "PROCESSING FEE");  //If otherfee does not contain 'PROCESSING FEE' then it will throw an error
int fee = feeObj.ProcessingFee; 

int? fee = otherfee.FirstOrDefault(o => o.ShortName == "PROCESSING FEE")?.FeeProcessing;

,或者如果您不想使用无效的数据类型,则

int fee = otherfee.FirstOrDefault(o => o.ShortName == "PROCESSING FEE")?.FeeProcessing ?? 0;

您可以读取单个((和first((之间的差异:此处

在最后一个代码中,我使用了?.??,更多详细信息阅读有关导航操作员和null-coalescing Operator in C#。

最新更新