2012-06-07 72 views
0

我正在使用动态LINQ来预处理一些用户请求。它的成立方式是,我会从那里收集数据到瓦尔数据从列表构建Linq查询<string>使用动态LINQ

var data = Project.Model.Adhoc.GetData().AsQueryable(); 

这基本上是一个SELECT * FROM视图

然后,我将通过所有的,我有选择循环以过滤用户选择

foreach (Filters filter in filters.OrderBy(x=>x.strOrderNumber)) 
      { 

有一些检查和排列一起,我得到了这个

data = data.Where(filter.strFilter + FormatOperator(filter.strOperator) + "@0", filter.strValue). 
           Select(x => x).ToList().AsQueryable(); 

这是工作得很好,但数据源开始增长,所以我想要做的是这样的:

data = data.select(get all items that were selected)然后做我的检查和排列。这将允许我只拉取需要的,而不是整个数据源。 C#中使用linq完成这件事的最好方法是什么?

Ex。

datasource = {Name, Age, Race, Gender, Hair Color, Eye Color, height, weight, etc} 

user selected = {Name, Age, Race, Gender} 

而不是查询针对整个数据源,我想限制数据源仅什么是用户了蝙蝠带进来,然后我可以基于作为德数据源

+0

就这样,我明白了,你基本上想发送一个“select * from myView where x = [something] and y = [something]”,这样SQL服务器只返回有限的结果吧? – CodingGorilla

回答

0

删除过滤器调用foreach循环中的.ToList()

data = data.Where()将生成与AND s的查询表达式。所以在循环之后,你最终可以调用.ToList()来最终击中数据库。

更新

而且。选择()是没有必要的。

data = data.Where(filter.strFilter + FormatOperator(filter.strOperator) + "@0", filter.strValue); 

UPDATE2

哦,再次阅读您的问题后,我得到你需要建立使用或查询。

使用标准库会有点困难。如果你不介意的额外的依赖那么它可以(可能)来完成牵引使用LinqKit

IQueryable<Product> SearchProducts (params string[] keywords) 
{ 
    var predicate = PredicateBuilder.False<Product>(); 

    foreach (string keyword in keywords) 
    { 
     string temp = keyword; 
     predicate = predicate.Or (p => p.Description.Contains (temp)); 
    } 
    return dataContext.Products.Where (predicate); 
} 

虽然我不知道如何与动态LINQ的一起工作。

否则,你就必须手工制作的表达,这可能最终会寻找与此类似:

public static class IQueryableExtensions 
{ 
    public static IQueryable<T> WhereIn<T, TValue>(
     this IQueryable<T> source, 
     Expression<Func<T, TValue>> propertySelector, 
     IEnumerable<TValue> values) 
    { 
     return source.Where(GetWhereInExpression(propertySelector, values)); 
    } 

    private static Expression<Func<T, bool>> GetWhereInExpression<T, TValue>(
     Expression<Func<T, TValue>> propertySelector, IEnumerable<TValue> values) 
    { 
     if (!values.Any()) 
      return c => false; 

     ParameterExpression p = propertySelector.Parameters.Single(); 

     // You'll have to adjust this: 
     var equals = values.Select(value => (Expression)Expression.Equal(
       propertySelector.Body, Expression.Constant(value, typeof(TValue)))); 

     var body = equals.Aggregate<Expression>(
       (accumulate, equal) => Expression.Or(accumulate, equal)); 
     return Expression.Lambda<Func<T, bool>>(body, p); 
    } 
} 
0

看看Dynamic Linq

可以使用DynamicQuery库反对任何LINQ数据提供者(包括LINQ to SQL,LINQ to Objects,LINQ to XML,LINQ to 实体,LINQ to SharePoint,LINQ to TerraServer等)。代替 使用语言运算符或类型安全的lambda扩展方法到 构建您的LINQ查询,动态查询库为您提供基于字符串的扩展方法 ,您可以将任何字符串 表达式传入。