C# 动态LINQ到实体,如何构建基于变量的查询
我需要构建的查询如下:C# 动态LINQ到实体,如何构建基于变量的查询,c#,linq-to-entities,dynamic-programming,C#,Linq To Entities,Dynamic Programming,我需要构建的查询如下: query = query.Where(s => ( (s.Title.Contains(title1) && s.EpisodeTitle.Contains(episodeTitle1)) || (s.Title.Contains(title2) && s.EpisodeTitle.Contains(episodeTitle
query = query.Where(s =>
(
(s.Title.Contains(title1) && s.EpisodeTitle.Contains(episodeTitle1))
||
(s.Title.Contains(title2) && s.EpisodeTitle.Contains(episodeTitle2)))
);
唯一的问题是,s.Title和s.eposodeTitle是动态的
这意味着以下变量可能是查询的一部分:
(string title1 = null,
string title2 = null,
string episodeTitle1 = null,
string episodeTitle2 = null,
string genre = null,
string directorName = null,
string releaseYear = null,
string seasonEpisode = null,
string showTypeDescription = null)
e、 g
在任何类型的组合中
我如何构造此查询而不必考虑这里的每一种可能性?如果您只需要
和
逻辑,您可以对需要搜索的每个属性重复调用.Where()
if(title != null) query = query.Where(x=>x.Title == title);
if(genre != null) query = query.Where(x=>x.Genre == genre);
如果您的查询始终具有特定的结构,并且您希望忽略空搜索值,那么您可以执行一个大的查询,但使用空检查来缩短属性比较
query = query.Where(s =>
(
((title1 == null || s.Title.Contains(title1))
&& (episodeTitle1 == null || s.EpisodeTitle.Contains(episodeTitle1))
||
((title2 == null || s.Title.Contains(title2))
&& (episodeTitle2 == null || s.EpisodeTitle.Contains(episodeTitle2))))
);
但是,如果需要对查询进行完全控制,则需要考虑使用PredicateBuilder或构建特定查询来搜索必要的属性。这里有一个关于Linq.Expressions的有用教程-如果您只需要
和
逻辑,您可以对需要搜索的每个属性重复调用.Where()
if(title != null) query = query.Where(x=>x.Title == title);
if(genre != null) query = query.Where(x=>x.Genre == genre);
如果您的查询始终具有特定的结构,并且您希望忽略空搜索值,那么您可以执行一个大的查询,但使用空检查来缩短属性比较
query = query.Where(s =>
(
((title1 == null || s.Title.Contains(title1))
&& (episodeTitle1 == null || s.EpisodeTitle.Contains(episodeTitle1))
||
((title2 == null || s.Title.Contains(title2))
&& (episodeTitle2 == null || s.EpisodeTitle.Contains(episodeTitle2))))
);
但是,如果需要对查询进行完全控制,则需要考虑使用PredicateBuilder或构建特定查询来搜索必要的属性。下面是一个关于Linq.Expressions的有用教程-最好的解决方案是与一起使用
使用(var context=new workEntities())
{
字典=新字典();
字典[“标题”]=新列表{
“网络工程师”,
“安全专家”,
“=Web开发人员”
};
字典[“薪金”]=新名单{“>=2000”};
字典[“休假时间”]=新列表{“>21”};
字典[“病假时间”]=新列表{“=01/01/2000”,
"28/02/2014"
};
dictionary[“ModifiedDate”]=新列表{DateTime.Now.ToString()};
var data=context.Employee.CollectionToQuery(dictionary.ToList();
}
最好的解决方案是与一起使用
使用(var context=new workEntities())
{
字典=新字典();
字典[“标题”]=新列表{
“网络工程师”,
“安全专家”,
“=Web开发人员”
};
字典[“薪金”]=新名单{“>=2000”};
字典[“休假时间”]=新列表{“>21”};
字典[“病假时间”]=新列表{“=01/01/2000”,
"28/02/2014"
};
dictionary[“ModifiedDate”]=新列表{DateTime.Now.ToString()};
var data=context.Employee.CollectionToQuery(dictionary.ToList();
}
尝试在PredicateBuilder
和LINQKit
上阅读。这可能是一个很好的起点:尝试阅读PredicateBuilder
和LINQKit
。这可能是一个很好的起点: