Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态LINQ到实体,如何构建基于变量的查询_C#_Linq To Entities_Dynamic Programming - Fatal编程技术网

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
。这可能是一个很好的起点: