我有数据表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=1
和Name='abc'
、Address='here'
和city='there'
一样,但如果您希望Name
是"abc"或"xyz",则需要"..和Name='abc'
或Name='xyz'
,但它的逗号分隔值对我来说就像Name={'abc,xyz'}
和我一样,无法将Name
转换为Name='abc'
或Name='xyz'
。