.net 动态创建LINQ语句

.net 动态创建LINQ语句,.net,linq,.net,Linq,我正在使用一个数据传输对象(名为:SearchSpec)和许多可为空的bools ... public bool? AL { get; set; } public bool? TL { get; set; } ... …要使用LINQ从表中筛选数据 var query = (from wv in Source select row); //Init query if (SearchSpec.AL != null) { query = (from wv in query

我正在使用一个数据传输对象(名为:SearchSpec)和许多可为空的bools

...
public bool? AL { get; set; }
public bool? TL { get; set; }
...
…要使用LINQ从表中筛选数据

var query = (from wv in Source select row); //Init query

if (SearchSpec.AL != null)
{
    query = (from wv in query
             where (wv.AL == SearchSpec.AL)
             select wv);
}

if (SearchSpec.TL != null)
{
    query = (from wv in query
             where (wv.TL == SearchSpec.TL)
             select wv);
}
...
return query.ToList();
…效果很好。如果bool不为null,我将使用它进行过滤,否则我将忽略它

现在,我必须用50多个标志过滤一些数据,就像我的示例中的两个(AL,TL)。我可以复制并粘贴if语句50次,但这不是正确的方法

我的想法是,使用一个像

var query = (from wv in Source select row); //Init query

query = (from wv in query
         where (SearchSpec.AL!=null && wv.AL==SearchSpec.AL)
         && (SearchSpec.TL!=null && wv.TL==SearchSpec.TL)
         ...
         select wv);
这似乎更好,但仍然是复制和粘贴


要点:是否有一种方法可以动态生成这些语句,例如使用反射来获取
bool类型的所有属性?
,然后。。。嗯,这是我的问题。

你想要那样的东西吗

    var query = (from wv in Source select row); //Init query

    query = (from wv in query
                 select wv);

    query = CreateDynamicBoolFilter(SearchSpec, query);

    public static IEnumerable<Source> CreateDynamicBoolFilter(SearchSpec searchSpec, IEnumerable<Source> query)
    {
        //Firstly, bool? properties of searchSpech object are retrieved using reflection
        var booleanProperties = searchSpec.GetType()
                .GetProperties()
                .Where(prop => prop.PropertyType == typeof(bool?));

        foreach (var prop in booleanProperties)
        {
            var propValue = (bool?) prop.GetValue(searchSpec, null);
            if (propValue != null) // Determine to prop value is nullable, if it doesn't apply filter
            {
                var propName = prop.Name;
                query = query.Where(x => (bool?) x.GetType().GetProperties().FirstOrDefault(p => p.Name == propName)?.GetValue(x, null) == propValue);
            }
        }
        return query;
    }
var query=(来自源选择行中的wv)//初始化查询
查询=(来自查询中的wv)
选择wv);
query=CreateDynamicBoolFilter(SearchSpec,query);
公共静态IEnumerable CreateDynamicBoolFilter(SearchSpec SearchSpec,IEnumerable查询)
{
//首先,使用反射检索searchSpech对象的布尔属性
var booleanProperties=searchSpec.GetType()
.GetProperties()
其中(prop=>prop.PropertyType==typeof(bool?);
foreach(布尔属性中的var prop)
{
var propValue=(bool?)prop.GetValue(searchSpec,null);
if(propValue!=null)//如果不应用筛选器,则确定prop值可为null
{
var propName=prop.Name;
query=query.Where(x=>(bool?)x.GetType().GetProperties().FirstOrDefault(p=>p.Name==propName)?.GetValue(x,null)==propValue);
}
}
返回查询;
}

你想要那样的东西吗

    var query = (from wv in Source select row); //Init query

    query = (from wv in query
                 select wv);

    query = CreateDynamicBoolFilter(SearchSpec, query);

    public static IEnumerable<Source> CreateDynamicBoolFilter(SearchSpec searchSpec, IEnumerable<Source> query)
    {
        //Firstly, bool? properties of searchSpech object are retrieved using reflection
        var booleanProperties = searchSpec.GetType()
                .GetProperties()
                .Where(prop => prop.PropertyType == typeof(bool?));

        foreach (var prop in booleanProperties)
        {
            var propValue = (bool?) prop.GetValue(searchSpec, null);
            if (propValue != null) // Determine to prop value is nullable, if it doesn't apply filter
            {
                var propName = prop.Name;
                query = query.Where(x => (bool?) x.GetType().GetProperties().FirstOrDefault(p => p.Name == propName)?.GetValue(x, null) == propValue);
            }
        }
        return query;
    }
var query=(来自源选择行中的wv)//初始化查询
查询=(来自查询中的wv)
选择wv);
query=CreateDynamicBoolFilter(SearchSpec,query);
公共静态IEnumerable CreateDynamicBoolFilter(SearchSpec SearchSpec,IEnumerable查询)
{
//首先,使用反射检索searchSpech对象的布尔属性
var booleanProperties=searchSpec.GetType()
.GetProperties()
其中(prop=>prop.PropertyType==typeof(bool?);
foreach(布尔属性中的var prop)
{
var propValue=(bool?)prop.GetValue(searchSpec,null);
if(propValue!=null)//如果不应用筛选器,则确定prop值可为null
{
var propName=prop.Name;
query=query.Where(x=>(bool?)x.GetType().GetProperties().FirstOrDefault(p=>p.Name==propName)?.GetValue(x,null)==propValue);
}
}
返回查询;
}

我还不能投票支持你,所以我想在这里加上“+1”就可以了。非常感谢你!我还不能投票支持你,所以我想在这里加一个“+1”就可以了。非常感谢你!