2012-06-07 71 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查詢,動態查詢庫爲您提供基於字符串的擴展方法 ,您可以將任何字符串 表達式傳入。