【问题标题】:why this LINQ statement getting error on matching value?为什么这个 LINQ 语句在匹配值上出现错误?
【发布时间】:2019-05-16 07:22:18
【问题描述】:

我有一个列表“otherfee”,我正在使用 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);

【问题讨论】:

  • 这将有助于提供哪个错误..
  • .Select(o =&gt; o); LOL 还是你的意思是,.FirstOrDefault(o =&gt; o.Id)
  • 这个函数的预期输入和输出是什么?
  • 我猜这是一个错字:你应该使用"PROCESSING FEE" 而不是'PROCESSING FEE'
  • 您正在将一个对象 List 分配给一个整数。并阅读@SebastianHofmann 的评论。你用的'不是"

标签: c# asp.net linq


【解决方案1】:

您将整个IEnumerable&lt;P_OtherFee&gt; 对象分配给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。 这与前面的代码实现了相同的结果,但可以避免编写空检查。

在这两种情况下,如果您只期望一个结果并且希望在获得多个结果时引发异常,则可以使用SingleOrDefault(...) 而不是FirstOrDefault(...)

【讨论】:

    【解决方案2】:

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

    如果你想选择一个 int :

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

    如果你想选择几个整数:

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

    正如@Sebastian Hofmann 提到的,你不能使用'' 来声明一个字符串,你必须使用""

    【讨论】:

    • 我认为这段代码行不通,因为您不能将IEnumerable&lt;int&gt; 隐式转换为int...而且仍然存在'PROCESSING FEE' 错字。
    • 没错,我回答的太快了。我将编辑我的答案。
    • 第一行代码无法编译,而第二行可以编译,但还需要几行代码来检查结果并将其中的一行分配给 int 变量。
    • @PrasadTelkikar 在获得结果之前选择确实会更有效。我会更新我的答案。
    【解决方案3】:

    您可以使用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 的可空数据类型,那么

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

    您可以阅读 Single() 和 First() 之间的区别:Here

    在最后的代码中,我使用了 ?.??,更多详细信息请阅读 C# 中的 navigation operatornull-coalescing operator

    【讨论】:

    • 前两行代码可能很危险,因为您没有处理任何可能的结果(SingleOrDefault 是更安全的选择),而另一行代码无法编译(但我猜“?”是一个错字)。
    • @StackLloyd,我已经在评论中提到了使用single'. No 时可能出现的错误?不是一个错字,刚刚阅读了关于 C# 中的导航运算符
    • 我知道运算符,但这意味着您还需要将fee声明为int?,而您没有这样做,对于如此简单的操作,这样的转换是不必要的。跨度>
    • 你可以用??operator:int fee = otherfee.FirstOrDefault(o =&gt; o.ShortName == "PROCESSING FEE")?.FeeProcessing ?? 0;来简化它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多