[英]Dynamic LINQ to Entities, how to build query based on variables
我需要建立的查詢是這樣的:
query = query.Where(s =>
(
(s.Title.Contains(title1) && s.EpisodeTitle.Contains(episodeTitle1))
||
(s.Title.Contains(title2) && s.EpisodeTitle.Contains(episodeTitle2)))
);
唯一的問題是s.Title和s.EpisodeTitle是動態的。
這意味着以下變量可能是查詢的一部分:
(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)
例如
query = query.Where(s =>
(
(s.DirectorName.Contains(directorName) && s.ShowTypeDescription.Contains(ShowTypeDescription))
||
(s.releaseYear.Contains(releaseYear) && s.genre.Contains(genre)))
);
在任何類型的組合中。
如何構造此查詢而不必考慮這里的每一種可能性?
如果只需要AND
邏輯,則可以針對需要搜索的每個屬性重復調用.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或System.Linq.Expressions構建特定的查詢以搜索必要的屬性。 這是有關Linq.Expressions的有用教程-http: //msdn.microsoft.com/zh-cn/library/vstudio/bb882637.aspx
最好的解決方案是將linqExtension與LINQKIT一起使用。
using (var context = new workEntities() )
{
Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
dictionary["Title"] = new List<string> {
"Network Engineer",
"Security Specialist",
"=Web Developer"
};
dictionary["Salary"] = new List<string> { ">=2000" };
dictionary["VacationHours"] = new List<string> { ">21" };
dictionary["SickLeaveHours"] = new List<string> { "<5" };
dictionary["HireDate"] = new List<string> {
">=01/01/2000",
"28/02/2014"
};
dictionary["ModifiedDate"] = new List<string> { DateTime.Now.ToString() };
var data = context.Employee.CollectionToQuery(dictionary).ToList();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.