【问题标题】:Dynamic LINQ to Entities, how to build query based on variablesDynamic LINQ to Entities,如何基于变量构建查询
【发布时间】:2013-06-24 03:52:24
【问题描述】:

我需要构建的查询是这样的:

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)))
            );

任何类型的组合。

我怎样才能构造这个查询而不必考虑这里的每一种可能性?

【问题讨论】:

标签: c# linq-to-entities dynamic-programming


【解决方案1】:

如果您只需要 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/en-us/library/vstudio/bb882637.aspx

【讨论】:

    【解决方案2】:

    最好的解决方案是使用linqExtensionLINQKIT

        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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多