Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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到SQL从字符串创建查询_C#_Asp.net_Sql_Linq - Fatal编程技术网

C# LINQ到SQL从字符串创建查询

C# LINQ到SQL从字符串创建查询,c#,asp.net,sql,linq,C#,Asp.net,Sql,Linq,我有一个dbml上下文查询,如下所示: var SQLQueryResult = (from activeTable in context.activeTabless where ( activeTable .AssignedTo == "Person1" || activeTable .AssignedTo == "Person

我有一个dbml上下文查询,如下所示:

var SQLQueryResult = (from activeTable in context.activeTabless
                      where (
                               activeTable .AssignedTo == "Person1" ||
                               activeTable .AssignedTo == "Person2" ||
                               activeTable .AssignedTo == "Person3")
                    select new { ... });
我的问题是,如何根据用户选择更新
where
字段,使其具有任意数量的
(而不仅仅是上述三个)

假设数字可以来自列表或数组。 这对于直接SQL来说很简单,但不确定如何通过LINQtoSQL实现

var persons = new []{"Person1", "Person2", "Person3"};
var SQLQueryResult = (from activeTable in context.activeTabless
                      where ( persons.Contains(activeTable .AssignedTo))
                    select new { ... });

您可以使用
IEnumerable
.Contains()
扩展方法检查集合中是否存在某些内容。您可以通过使用表达式动态创建查询,以生成where谓词。您可以在此处找到更多详细信息和示例:

您可以使用谓词生成器(实用程序类):

使用系统;
使用System.Linq;
使用System.Linq.Expressions;
公共静态类谓词生成器{
公共静态表达式Make(){
返回null;
}
公共静态表达式Make(此表达式谓词){
返回谓词;
}
公共静态表达式或(此表达式expr、表达式或表达式){
if(expr==null){
返回或表达;
}
var invokedExpr=Expression.Invoke(orExpression,expr.Parameters.Cast());
返回Expression.Lambda(Expression.Or(expr.Body,invokedExpr),expr.Parameters);
}
公共静态表达式和(此表达式expr、表达式和表达式){
if(expr==null){
返回和表达;
}
var invokedExpr=Expression.Invoke(andExpression,expr.Parameters.Cast());
返回Expression.Lambda(Expression.And(expr.Body,invokedExpr),expr.Parameters);
}
}
用法:

public IEnumerable<Squad> GetSquadsByIDs(IEnumerable<int> squadIDs) {
  if (squadIDs == null || !squadIDs.Any()) {
    throw new ArgumentNullException("squadIDs");
  }
  var condition = PredicateBuilder.Make<Squad>(s => false);
  foreach (var squadID in squadIDs) {
    int squadIDValue = squadID;
    condition = PredicateBuilder.Or<Squad>(condition, s => s.SquadID == squadIDValue);
  }
  var db = m_DalContextProvider.GetContext();
  return db.Squads.Where(condition);
}
public IEnumerable GetSquadById(IEnumerable SquadDS){
if(squadIDs==null | |!squadIDs.Any()){
抛出新的ArgumentNullException(“squadIDs”);
}
var condition=PredicateBuilder.Make(s=>false);
foreach(变量squadID in squadIDs){
int squadIDValue=squadID;
条件=PredicateBuilder.Or(条件,s=>s.SquadID==squadIDValue);
}
var db=m_DalContextProvider.GetContext();
返回db.Squads.Where(条件);
}

这是一个解决方案,但您至少需要注意两件事:1)如果SQL server上的人员包含的项目超过2100个,则该方法不起作用;2)在ansi列上的工作速度非常慢。就是这样。谢谢它应该是好的,因为它永远不会达到2100项。该解决方案有一个伪递归问题,如下所述:
public IEnumerable<Squad> GetSquadsByIDs(IEnumerable<int> squadIDs) {
  if (squadIDs == null || !squadIDs.Any()) {
    throw new ArgumentNullException("squadIDs");
  }
  var condition = PredicateBuilder.Make<Squad>(s => false);
  foreach (var squadID in squadIDs) {
    int squadIDValue = squadID;
    condition = PredicateBuilder.Or<Squad>(condition, s => s.SquadID == squadIDValue);
  }
  var db = m_DalContextProvider.GetContext();
  return db.Squads.Where(condition);
}