【问题标题】:Entity Framework Linq query for filtering records用于过滤记录的实体框架 Linq 查询
【发布时间】:2015-08-21 07:55:46
【问题描述】:

我正在填充一个网格。我在屏幕上有两个过滤器用于“MerchantName”和“MerchantId”列。如果过滤器为空并且按下搜索按钮,则应显示所有记录,否则如果任何过滤器具有值,则应在该记录上过滤记录。我正在使用实体框架来提取数据。

merchantsList = dbContext.MERCHANT.Where();

这是我的实体,我如何在 where 子句中做到这一点。 MerchantName 为字符串类型,商家 ID 为 Int。

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    将 INPUT_MERCHANTNAME 和 INPUT_ID 替换为请求值。

    var merchantName = INPUT_MERCHANTNAME;
    int? id = INPUT_ID;
    
    merchantsList = dbContext.MERCHANT.Where(x =>
      (id.HasValue ? x.Id == id.Value : true) ||
      (!(merchantName == null || merchantName  == "") ? x.MerchantName.Equals(merchantName) : true));
    

    如果 id 和 MercerName 都为空/空,这将为您提供所有记录,并且如果它们被指定,它将过滤。

    【讨论】:

    • 其给出错误:“LINQ to Entities 无法识别方法 'Boolean IsNullOrWhiteSpace(System.String)' 方法,并且该方法无法转换为存储表达式。”
    • 虽然这可行,但我不推荐它,因为它几乎不可读。最好使用简单的 if/else。顺便说一句,@Rikard,您在检查 id 时错过了一个“=”。
    【解决方案2】:

    分离您的过滤器。
    它将使其更具可读性,并允许您在以后轻松添加更多过滤器。

    var merchantName = INPUT_MERCHANTNAME;
    int? id = INPUT_ID;
    
    var list = dbContext.MERCHANT.AsQueryable();
    
    if (!string.IsNullOrWhitespace(merchantName)) {
        list = list.Where(m => m.MerchantName == merchantName);
    }
    
    if (id.HasValue) {
        list = list.Where(m => m.Id == id.Value);
    }
    
    return list.ToList();
    

    编辑:这会将过滤器和过滤器放在一起。
    如果您一次只想使用一个过滤器,请尝试以下操作:

    var merchantName = INPUT_MERCHANTNAME;
    int? id = INPUT_ID;
    
    var list = dbContext.MERCHANT.AsQueryable();
    
    //Lets say ID is more important than name.
    if (id.HasValue) {
        list = list.Where(m => m.Id == id.Value);
    }else {
        if (!string.IsNullOrWhitespace(merchantName)) {
            list = list.Where(m => m.MerchantName == merchantName);
        }
    }
    
    return list.ToList();
    

    如果你想 OR 两个过滤器:

    var merchantName = INPUT_MERCHANTNAME;
    int? id = INPUT_ID;
    
    var list = dbContext.MERCHANT.AsQueryable();
    
    list = list.Where(m => (merchantName != null && m.MerchantName == merchantName) || (id != null && m.Id == id.Value));
    
    
    return list.ToList();
    

    【讨论】:

    • 它和一个查询中的不一样。现在所有过滤器之间都有AND,如何支持OR?
    • 没错,它会将这些过滤器组合在一起。我会编辑答案
    • 我不明白为什么这被否决了。请解释一下。
    【解决方案3】:
    if(textBox.Text == "")
    {
      merchantsList = dbContext.MERCHANT.ToList();
    }
    else
    {
      merchantsList = (context.CITY.Where(q => q.MerchantName.Contains(textBox.Text))).ToList();
    
    }
    

    我正在使用这种技术进行搜索。

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 2014-10-13
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多