【问题标题】:c# conditional OrderByc# 条件 OrderBy
【发布时间】:2015-12-10 11:28:52
【问题描述】:

我有一个 Article 具有以下结构的实体

public class Article
{
    public decimal Price {get;set;}
    public decimal? SalePrice {get;set;}
    public bool OnSale {get;set;}
}

我需要做的是通过以下条件按价格查询文章: 如果商品在打折,则以销售价格为准,如果没有,则以正常价格为准。

举个例子:

  • A 条(OnSale = True,Price = 10,SalePrice = 5)
  • B 条(ONSale = False,Price = 4,SalePrice = NULL)
  • C 条(OnSale = False,Price = 22,SalePrice = 10)

按价格订购时,顺序应为

B(价格4)

A(价格 5) - 因为它是销售价格

C(价格 22)

我试过了

IQueryable<Article> articlesQuery = dal.Where<Article>(m => m.Active);
articlesQuery = articlesQuery.OrderBy(m => m.OnSale ? m.PriceSale : m.PriceSale);

但它没有给出想要的结果。

感谢任何帮助。

【问题讨论】:

  • 为什么你在 lambda 中使用了两次PriceSale
  • 除了提到和解决的问题,我不认为用文章存储价格是一个很好的设计,原因有很多。为什么不引入 ArticlePrice 和 public ICollection&lt;ArticlePrice&gt; ArticlePrices { get; set; } 属性?一个价格只能在一段时间内有效,并且可以有多个重叠销售。然后可以在ArticlePrice注册某个价格是促销价还是一次性折扣。

标签: c# linq linq-to-sql lambda


【解决方案1】:

if 两边是同一个变量? (而不是上述类中的变量)。
不应该是:

articlesQuery = articlesQuery.OrderBy(m => m.OnSale ? m.SalePrice: m.Price);

【讨论】:

  • 感谢您的评论。经过漫长的工作日,我没有看到那个小错误:) 我将设置我的问题被删除
【解决方案2】:

您可以使用Article 上的附加只读属性来做到这一点,以使代码更易于阅读:

public class Article
{
    public decimal NormalPrice { get; set; }
    public decimal? SalePrice { get; set; }
    public bool OnSale { get; set; }

    public decimal Price
    {
        get
        {
            if (this.OnSale)
            {
                return this.SalePrice.Value;
            }
            else
            {
                return this.NormalPrice;
            }
        }
    }
}

并使用它:

IQueryable<Article> articlesQuery = dal.Where<Article>(m => m.Active);
articlesQuery = articlesQuery.OrderBy(m => m.Price);

【讨论】:

  • 不,这不会。我应该看到你在使用 DAL。
猜你喜欢
  • 2013-12-27
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多