【问题标题】:How to check if column value has "value"如何检查列值是否具有“值”
【发布时间】:2019-07-01 20:49:34
【问题描述】:

我想检查“Acceptance”的值是否为“Accepted”以及它是否具有该值 - .Sum 否则我想得到 0,但是在找到正确的语法时遇到了一些问题。我无法获得“接受”值

我的方法

public decimal Prices2(string term)
{
   var kl= db.Order.Where(x => x.Client == term && x.Acceptance == "Accepted");
    if (term != null && kl.Acceptance == "Accepted" )
    {                       ^^//Element does not contain definition"Acceptance"
        return kl.Sum(x => x.Price);
    }
    else
    {
        return 0;
    }
}

我如何获得“术语”

public IEnumerable<string> GetClient(string term)
{
    return db.Order.Where(x => (term != null && x.Client.Contains(term)) || (term == null)).OrderBy(c => c.Client).Take(10).Select(a => a.Client).Distinct();
}

当我尝试这个时:

return db.Order.Where(x => x.Client == term && x.Acceptance == "Accepted").sum(x=>x.Price)

当客户没有“已接受”订单时出现错误

System.InvalidOperationException:“转换为值类型“System.Decimal”失败,因为具体化值为空。结果类型的泛型参数或查询必须使用可为空的类型。”

我如何先检查是否有客户接受的订单,如果有则返回0?

【问题讨论】:

  • 这是因为变量kl 是一个IEnumerable&lt;Order&gt;,其中Client 属性等于作为参数给出的变量term,其中Acceptance 设置为“已接受”
  • 好的,我知道Acceptance 不是一种方法,所以我不能那样使用它,但是我如何检查该列的值来进行计算或得到 0?
  • 您想获取给定客户所有已接受订单价格的总和吗?
  • return db.Order.Where(x => x.Client == term && x.Acceptance == "Accepted").sum(x=>x.Price);
  • @Ammar 是的,我想汇总所有接受的订单,但是当客户没有接受的订单时我收到错误,因为它为空

标签: c# asp.net-mvc linq asp.net-core


【解决方案1】:

首先将查询分配给一个变量,

var orders = db.Order.Where(x => x.Client == term && x.Acceptance == "Accepted");
var result= orders.Count() > 0 ? orders.Sum(x=>x.Price) : 0.0M;
return result;

你的方法返回类型应该是十进制

.

【讨论】:

    【解决方案2】:

    首先,您的代码将不起作用,因为变量 kl 的类型为 IEnumerable&lt;Order&gt;,它没有属性 Acceptance

    @uk2k05 在 cmets 部分提到的代码将解决您的问题:

    return db.Order
        .Where(x => x.Client == term && x.Acceptance == "Accepted")
        .Sum(x => x.Price);
    

    但是会出现另一个问题,那是因为Sum方法返回Nullable&lt;Decimal&gt;,而你的方法Prices2返回decimalClick to see docs

    要解决此问题,您可以改用以下代码:

    return db.Order
        .Where(x => x.Client == term && x.Acceptance == "Accepted")
        .Sum(x => x.Price) ?? 0;
    

    这将返回Sum返回的值,如果返回值为null,则返回0。

    【讨论】:

    • 问题是你不能将?? 用于“十进制”或“整数”,所以我得到另一个错误
    • 为什么不呢?见thisint? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1Sum 方法返回Nullable&lt;Int32&gt; 等于int?,你试过代码吗?你使用它有什么错误吗?另外,请在您的Order 模型中提供Price 的类型。
    • Price 类型为十进制,我尝试使用此代码,但出现无法应用运算符“??”的错误参数类型为“decimal”或“int”
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多