C# LINQ到SQL从字符串创建查询
我有一个dbml上下文查询,如下所示: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
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);
}