【问题标题】:Using Linq to filter by List<ListItem>使用 Linq 按 List<ListItem> 过滤
【发布时间】:2014-04-30 11:54:59
【问题描述】:

我正在尝试使用其他搜索条件扩展我的 linq 查询,以通过发送 List&lt;Listitem&gt; 到函数进行处理来过滤数据。该列表可以包含 1 个或多个项目,目标是检索符合任何条件的所有项目。 由于我向函数发送了几个搜索条件,因此目标是使过滤结果更准确,我发送给过滤器的信息越多。如果一个或多个条件为空,则过滤器将获得不太准确的结果。 每次执行以下代码时都会引发异常,我无法弄清楚如何解决 using 语句以包含 List&lt;ListItem&gt;。提前感谢所有帮助!

例外:Unable to create a constant value of type 'System.Web.UI.WebControls.ListItem'. Only primitive types or enumeration types are supported in this context.

using (var db = new DL.ENTS())
{
    List<DL.PRODUCTS> products = 
    (from a in db.PRODUCTS
      where (description == null || description == "" || 
            a.DESCRIPTION.Contains(description)) &&
            (active == null || active == "" || a.ACTIVE.Equals(active, StringComparison.CurrentCultureIgnoreCase)) &&
            (mID == null || mID == "" || a.MEDIA_ID == mID) &&
            (mID == null || objTypes.Any(s => s.Value == a.OBJECTS)) //Exception here!
      select a).ToList<DL.PRODUCTS>();

    return products;
}

【问题讨论】:

    标签: c# linq linq-to-entities


    【解决方案1】:

    将原始值的集合传递给表达式:

    using (var db = new DL.ENTS())
    {
        var values = objTypes.Select(s => s.Value).ToArray();
    
        List<DL.PRODUCTS> products = 
            (from a in db.PRODUCTS
             where (description == null || description == "" || a.DESCRIPTION.Contains(description)) &&
                   (active == null || active == "" || a.ACTIVE.Equals(active, StringComparison.CurrentCultureIgnoreCase)) &&
                   (mID == null || mID == "" || a.MEDIA_ID == mID) &&
                   (mID == null || values.Contains(a.OBJECTS)) 
             select a).ToList<DL.PRODUCTS>();
    
        return products;
    }
    

    这将生成 SQL IN 子句。


    注意 - 您可以使用 lambda 语法通过添加基于某些条件的过滤器来组合查询:

     var products = db.PRODUCTS;
    
     if (!String.IsNullOrEmpty(description))
         products = products.Where(p => p.DESCRIPTION.Contains(description));
    
     if (!String.IsNullOrEmpty(active))
         products = products.Where(p => p.ACTIVE.Equals(active, StringComparison.CurrentCultureIgnoreCase)));
    
     if (!String.IsNullOrEmpty(mID))
         products = products.Where(p => p.MEDIA_ID == mID);
    
     if (mID != null)
         products = products.Where(p => values.Contains(p.OBJECTS));
    
     return products.ToList();
    

    【讨论】:

      【解决方案2】:

      Linq 无法将 ListItem 上的谓词转换为对 Sql 有用的东西。

      我建议您将 ListItems 的值预先投影到一个简单的 List&lt;string&gt; 中,然后再将其与 Contains 一起使用(转换为 IN)

      var listValues = objTypes.Select(_ => _.Value).ToList();
         List<DL.PRODUCTS> products = ...
         listValues.Contains(a.OBJECTS))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 2023-04-05
        • 1970-01-01
        • 2015-04-13
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多