我有一个列表"其他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#。