按具有字符串属性列表的对象筛选列表

本文关键字:列表 筛选 对象 属性 字符串 | 更新日期: 2023-09-27 17:57:08

class

   public class AlldataPoints
  {
    public int phase{ get; set; }
    public string recr{ get; set; }
    public string study{ get; set; }
  }

public class filter
{
    public List<string> Phase;
    public List<string> recr;
    public List<string> study;
}

我有一个上面的类列表,说所有数据点"lst"和一个类过滤器"obj"的对象。

我只想过滤那些"lst"行,其中"obj"中的阶段值与"lst"阶段"匹配,"obj"中的"recr"

值与"lst"recr"中的"recr"匹配。 我想使用实体表达式。

按具有字符串属性列表的对象筛选列表

在过滤器参数列表中使用 Contains

filter obj;
IEnumerable<AlldataPoints> lst;   
var result = lst.Where(item => obj.Phase.Contains(item.phase) && obj.recr.Contains(item.recr));

你来了:

public List<AlldataPoints> FilterPoinst(List<AlldataPoints> points, filter filter)
{
    return points.Where(x => filter.Phase.Contains(x.phase)
        && filter.recr.Contains(x.recr)
        && filter.study.Contains(x.study)).ToList();
}

如果您需要匹配一个属性,则只需将&&替换为||运算符:

在您的代码中,只需调用此函数:

var filter = new filter(); //init your filter
List<AlldataPoints> points = new List<AlldataPoints>(); // Here you should get your points
var filteredPoints = FilterPoinst(points, yourFilter); //you get your filtered points.

如果这是针对 DbContext 的 Linq-to-Entities 查询,您仍然可以使用 Contains() 来检查每个值是否在每个相应的列表中。

曾经尴尬的事情是你需要将phase转换为字符串,因为它是一个int,列表是一个List<string>,但你不能只使用ToString(),你必须使用SqlFunctions.StringConvert() - 看到这个答案。

dbContext.AllDataPoints.Where(adp =>
    filter.Phase.Contains(SqlFunctions.StringConvert((double)adp.phase).Trim())
    && filter.recr.Contains(adp.recr)
    // && filter.study.Contains(adp.study)
)