使用linq或c#筛选Datatable动态/多重条件



我有数据表dtResult,它的列是

BuildSequence,
Build#, 
BOptions,
BJob, 
LogID BType, 
BTypeKey, 
BComponentName, 
BCKey, 
RName, 
Rkey, 
RDescrip, 
RStatus, 
BuildMatchExp,
VPart, 
PNumber, 
SName, 
SKey, 
OName, 
OKey, 
Date

现在我有一些过滤器,这些过滤器是动态创建的,然后用户可以选择这些过滤器。这些筛选器是dtResult的列名。我有一个所选过滤器的列表,该列表包含过滤器名称及其值。我的问题是基于选定的筛选器如何筛选dtResult?由于这些过滤器不是恒定的,它们每次都在变化。每次更改我的意思是允许用户选择任何筛选器。

例如;在一种情况下,用户可以选择BTypeKey和/或BCKey和/或者Rkey,简而言之,他们可以选择任何过滤器或不选择过滤器。

现在我可以根据"固定"列过滤dResult,但我不确定如何在动态过滤器上进行过滤?或者我怎么能用linq来做呢?

任何帮助都将非常感谢,因为我正在与之斗争。

到目前为止,在代码端,我只有FilterList作为这个

FilterParameters filterlist = new FilterParameters(); 
filterlist.Add(new FilterParameter(this._BuildSequence, this._BuildSequenceName, FilterParameterTypes.Guid, FilterComparisonTypes.BuildSequence)); 
filterlist.Add(new FilterParameter(this._BCKey, this._BComponentName, FilterParameterTypes.Guid, FilterComparisonTypes.BCKey)); 
filterlist.Add(new FilterParameter(this._BTypeKey, base.BTypeName, FilterParameterTypes.Guid, FilterComparisonTypes.BTypeKey)); 
return filterlist; 

感谢

我认为我处理这一问题的方法是让Filter对象对基本查询返回的IQueryable进行操作。然后将Filter对象映射到用户选择的筛选器。

例如:

class SomeDbContext : DbContext
{
    public IDbSet<Person> People { get; set; }
}
class Person
{
    public string Foreame { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
}
abstract class PersonFilter
{
    public abstract IQueryable<Person> Filter(IQueryable<Person> query, string value);
}
class PersonForenameFilter : PersonFilter
{
    public override IQueryable<Person> Filter(IQueryable<Person> query, string value)
    {
        return query.Where(t => t.Foreame == value);
    }
}
class PersonAgeFilter : PersonFilter
{
    public override IQueryable<Person> Filter(IQueryable<Person> query, string value)
    {
        return query.Where(t => t.Age.ToString() == value);
    }
}

然后,您可以使用Dictionary在用户可选择的友好标签和Filter对象之间创建映射。然后你就做:

string filterValue = "Dave";
var someFilter = new PersonForenameFilter();
var baseQuery = dbContext.People;
var filteredQuery = someFilter.Filter(baseQuery, filterValue);

实际从映射字典中检索someFilter的位置。

此外,请注意,这是可组合的,因此您可以应用多个过滤器。

感谢@MethodMan,您的DataTable.Select方法成功了,我使用将我的Filterlist转换为表达式

var a = filterList.GroupBy(g => g.ParameterName).Select(gr => 
    string.Format("{0}={1}", gr.First().ParameterName, string.Join(",", gr.Select(g => g.Value))));
var b = string.Join(" And ", a.ToArray());

然而,我仍然坚持将SQL参数传递给存储过程,因为其中一个参数是csv(我在数据库端使用了Split表示csv),Select方法的表达式必须像ID=1Name='abc'Address='here'city='there'一样,但如果您希望Name是"abc"或"xyz",则需要"..和Name='abc'Name='xyz',但它的逗号分隔值对我来说就像Name={'abc,xyz'}和我一样,无法将Name转换为Name='abc'Name='xyz'

最新更新