.net 动态创建LINQ语句
我正在使用一个数据传输对象(名为:SearchSpec)和许多可为空的bools.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
...
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”就可以了。非常感谢你!