按具有字符串属性列表的对象筛选列表
本文关键字:列表 筛选 对象 属性 字符串 | 更新日期: 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)
)