c# - 使用 Linq 按 List<ListItem> 进行过滤

标签 c# linq linq-to-entities

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

异常: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;
}

最佳答案

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

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();

关于c# - 使用 Linq 按 List<ListItem> 进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23387415/

相关文章:

c# - 无法转换类型 'AnonymousType#1'

c# - LINQ Group By 多个参数或字段

C# linq 异常 : object reference not set to an instance of an object

c# - 加载记录集,一次加载 4 个项目

c# - EF-如何使用 Linq to Entities 执行 'Not In'

c# - 如何抽象 Linq 查询的选择列表中的字段?

c# - NetMQ接收/响应在循环时不起作用

c# - Asp.net session 变量

c# - C# 中用于视频的文件上传控件

c# - 为什么修改列表会影响过滤的列表?