C# 搜索IEnumerable中所有字段以查找c中任何匹配项的通用方法#

C# 搜索IEnumerable中所有字段以查找c中任何匹配项的通用方法#,c#,C#,下面的代码可以很好地与DataTables插件的API配合使用;对于DataTables搜索的每个列,无论其类型如何,过滤器都会根据所提供的内容按预期工作 DataTables还有一个“全局”搜索功能,您可以在一个字段中进行搜索,如果所述数据的任何行中存在匹配项,则返回匹配项 NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query); var generalSearch = nvc["sSe

下面的代码可以很好地与DataTables插件的API配合使用;对于DataTables搜索的每个列,无论其类型如何,过滤器都会根据所提供的内容按预期工作

DataTables还有一个“全局”搜索功能,您可以在一个字段中进行搜索,如果所述数据的任何行中存在匹配项,则返回匹配项

NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);

var generalSearch = nvc["sSearch"];
if (!string.IsNullOrWhiteSpace(generalSearch))
{
    var generalSearchProperties = typeof(T).GetProperties();
    foreach (var currentProperty in generalSearchProperties)
    {
        Type propType = currentProperty.PropertyType;
        set = set.Where(StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType));
        /*        ^^^^^        */
        /*
        Instead of the "Where" here I am looking for something like "where or" which can be added to the IEnumerable.
        */
    }
}
我希望的是: 对IEnumerable执行搜索的一种方法,如果任何字段与搜索匹配,则返回结果

NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);

var generalSearch = nvc["sSearch"];
if (!string.IsNullOrWhiteSpace(generalSearch))
{
    var generalSearchProperties = typeof(T).GetProperties();
    foreach (var currentProperty in generalSearchProperties)
    {
        Type propType = currentProperty.PropertyType;
        set = set.Where(StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType));
        /*        ^^^^^        */
        /*
        Instead of the "Where" here I am looking for something like "where or" which can be added to the IEnumerable.
        */
    }
}
NameValueCollection nvc=HttpUtility.ParseQueryString(Request.RequestUri.Query);
var generalSearch=nvc[“sSearch”];
如果(!string.IsNullOrWhiteSpace(generalSearch))
{
var generalSearchProperties=typeof(T).GetProperties();
foreach(generalSearchProperties中的var currentProperty)
{
类型propType=currentProperty.PropertyType;
set=set.Where(StaticUtility.PropertyEquals(currentProperty,generalSearch,propType));
/*        ^^^^^        */
/*
在这里,我不是在寻找“Where”,而是寻找可以添加到IEnumerable中的类似“Where或”。
*/
}
}
原始代码:
受保护的虚拟IQueryable筛选器属性BySearchParameters(IQueryable集合)
{
尝试
{
NameValueCollection nvc=HttpUtility.ParseQueryString(Request.RequestUri.Query);
var props=typeof(T).GetProperties();
foreach(道具中的var道具)
{
var name=prop.name;
var val=nvc[名称];
类型propType=prop.PropertyType;
如果(val!=null)
{
set=set.Where(StaticUtility.PropertyEquals(prop,val,propType));
}
if(nvc.GetPairs().Where(p=>p.Value==name).Where(p=>p.Key.StartsWith(“mDataProp”)).Any())
{
var key=nvc.GetPairs().Where(p=>p.Value==name).Where(p=>p.key.StartsWith(“mDataProp”).FirstOrDefault().key;
key=key.Replace(“mDataProp”、“sSearch”);
val=nvc[键];
如果(!String.IsNullOrEmpty(val))
set=set.Where(StaticUtility.PropertyEquals(prop,val,propType));
}
}
返回集;
}捕获(异常exc)
{
返回集;
}
}

如果我正确理解您的请求,您基本上希望搜索您的数据并匹配任何字段以获得相等性?如果这是真的,那么只需将匹配的数据添加到一个新的集合中,并在事实发生后通过
.Distinct()
对其进行过滤,以确保每个数据都有一条记录。大概是这样的

NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
var results = new IEnumerable<T>();

var generalSearch = nvc["sSearch"];
if (!string.IsNullOrWhiteSpace(generalSearch))
{
    var generalSearchProperties = typeof(T).GetProperties();
    foreach (var currentProperty in generalSearchProperties)
    {
        Type propType = currentProperty.PropertyType;
        results.AddRange(set.Where(StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType)));

    }
}
return results.Distinct();
NameValueCollection nvc=HttpUtility.ParseQueryString(Request.RequestUri.Query);
var results=new IEnumerable();
var generalSearch=nvc[“sSearch”];
如果(!string.IsNullOrWhiteSpace(generalSearch))
{
var generalSearchProperties=typeof(T).GetProperties();
foreach(generalSearchProperties中的var currentProperty)
{
类型propType=currentProperty.PropertyType;
results.AddRange(set.Where(StaticUtility.PropertyEquals(currentProperty,generalSearch,propType));
}
}
返回results.Distinct();

如果我正确理解您的请求,您基本上希望搜索您的数据并匹配任何字段以获得相等性?如果这是真的,那么只需将匹配的数据添加到一个新的集合中,并在事实发生后通过
.Distinct()
对其进行过滤,以确保每个数据都有一条记录。大概是这样的

NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
var results = new IEnumerable<T>();

var generalSearch = nvc["sSearch"];
if (!string.IsNullOrWhiteSpace(generalSearch))
{
    var generalSearchProperties = typeof(T).GetProperties();
    foreach (var currentProperty in generalSearchProperties)
    {
        Type propType = currentProperty.PropertyType;
        results.AddRange(set.Where(StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType)));

    }
}
return results.Distinct();
NameValueCollection nvc=HttpUtility.ParseQueryString(Request.RequestUri.Query);
var results=new IEnumerable();
var generalSearch=nvc[“sSearch”];
如果(!string.IsNullOrWhiteSpace(generalSearch))
{
var generalSearchProperties=typeof(T).GetProperties();
foreach(generalSearchProperties中的var currentProperty)
{
类型propType=currentProperty.PropertyType;
results.AddRange(set.Where(StaticUtility.PropertyEquals(currentProperty,generalSearch,propType));
}
}
返回results.Distinct();

您可以尝试首先创建一个包含所有不同选项的
二进制表达式,然后将该表达式传递给查询的
Where()
方法

假设您的
StaticUtility
类用于创建表达式,您可以尝试以下操作:

NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);

// Container for filter expression
BinaryExpression filter = null;

var generalSearch = nvc["sSearch"];
if (!string.IsNullOrWhiteSpace(generalSearch)) {
    var generalSearchProperties = typeof(T).GetProperties();
    foreach (var currentProperty in generalSearchProperties) {
        Type propType = currentProperty.PropertyType;

        if (filter == null) {
            // Start with first filter expression
            filter = StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType);
        } else {
            // Add another filter using OR
            BinaryExpression other = StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType);
            filter = BinaryExpression.OrElse(filter, other);
        }
    }
}

// Add actual filter to query
set = set.Where(filter);
NameValueCollection nvc=HttpUtility.ParseQueryString(Request.RequestUri.Query);
//过滤器表达式的容器
BinaryExpression过滤器=null;
var generalSearch=nvc[“sSearch”];
如果(!string.IsNullOrWhiteSpace(generalSearch)){
var generalSearchProperties=typeof(T).GetProperties();
foreach(generalSearchProperties中的var currentProperty){
类型propType=currentProperty.PropertyType;
if(filter==null){
//从第一个过滤器表达式开始
filter=StaticUtility.PropertyEquals(currentProperty、generalSearch、propType);
}否则{
//使用或添加另一个筛选器
BinaryExpression other=StaticUtility.PropertyEquals(currentProperty、generalSearch、propType);
filter=BinaryExpression.OrElse(filter,other);
}
}
}
//将实际筛选器添加到查询
set=set.Where(过滤器);

您可以尝试首先创建一个包含所有不同选项的
二进制表达式,然后将该表达式传递给查询的
Where()
方法

假设您的
StaticUtility
类用于创建表达式,您可以尝试以下操作:

NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);

// Container for filter expression
BinaryExpression filter = null;

var generalSearch = nvc["sSearch"];
if (!string.IsNullOrWhiteSpace(generalSearch)) {
    var generalSearchProperties = typeof(T).GetProperties();
    foreach (var currentProperty in generalSearchProperties) {
        Type propType = currentProperty.PropertyType;

        if (filter == null) {
            // Start with first filter expression
            filter = StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType);
        } else {
            // Add another filter using OR
            BinaryExpression other = StaticUtility.PropertyEquals<T>(currentProperty, generalSearch, propType);
            filter = BinaryExpression.OrElse(filter, other);
        }
    }
}

// Add actual filter to query
set = set.Where(filter);
NameValueCollection nvc=HttpUtility.ParseQueryString(Request.RequestUri.Query);
//过滤器表达式的容器
BinaryExpression过滤器=null;
var generalSearch=nvc[“sSearch”];
如果(!string.IsNullOrWhiteSpace(generalSearch)){
var generalSearchProperties=typeof(T).GetProperties();
foreach(generalSearchProperties中的var currentProperty){
pr型