【问题标题】:LINQ greater/less than not working in queryLINQ 大于/小于在查询中不工作
【发布时间】:2020-03-06 22:48:54
【问题描述】:

var query = db.Products.Where(p => p.Cost == 10M); 可以正常工作并返回正确的结果列表。 var query = db.Products.Where(p => p.Cost > 10M); 抛出异常:

The LINQ expression 'DbSet<Product>.Where(p => p.Cost > (Nullable<decimal>)10)' could not be translated.

显然C#生成的脚本不能在SQL中执行,但为什么不能呢?这是一个有效的 SQL 查询

public class Product
    {
        public int ProductID {get;set;}
        [Required]
        [StringLength(40)]
        public string ProductName {get;set;}
        [Column("UnitPrice", TypeName="money")]
        public decimal? Cost {get;set;}
    }

    public class Northwind: DbContext
    {
        public DbSet<Category> Categories {get;set;}
        public DbSet<Product> Products {get;set;}
    }

EFCore 3.1.2, .NET Core 3.1.1

【问题讨论】:

    标签: c# linq entity-framework-core


    【解决方案1】:

    看起来p.Costdecimal?。在这种情况下,您可以使用null coalescing operator

    var query = db.Products.Where(p => (p.Cost ?? 0) > 10M);
    

    【讨论】:

      【解决方案2】:

      这是因为 Cost 是可以为空的小数,即小数?

      Equals 不会抛出错误,因为它可以检查是否 null == 10M,但是,如果要大于它必须在幕后执行 p.Cost.Value,但它不知道如何执行此操作。

      所以有两个选择 将 p.Cost 更改为“十进制”而不是可空类型或 假设 p.Cost 永远不会为空,这可能只是将 linq 更改为

      p =&gt; p.Cost.Value &gt; 10M

      【讨论】:

      • 所以你和亚瑟都有一个很好的观点,那就是它是一个可以为空的十进制类型,但我已经尝试了你的建议,我仍然得到这个错误。 var query = db.Products.Sum(p =&gt; p.Cost) 也不起作用所以我错过了什么吗?
      • 那是因为p =&gt; p.Cost 挑选出Cost 属性不是严格的数字,它是一个可以为空的数字。您是否尝试按照@michaelCeber 的建议将其更改为p =&gt; p.Cost.Value
      • 你用的是什么数据库?
      • @Bugbeeb 根据我的回答,你试过var query = db.Products.Sum(p =&gt; p.Cost ?? 0)吗?
      【解决方案3】:
      var query = db.Products.Where(p => p.Cost.HasValue && p.Cost.Value > 10M);
      

      这个查询的可读形式可以写成如上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多