2017-06-07 53 views
5

我有一個包含30列的表, ,它包含1000行。 我想要一個LINQ查詢,它將檢查所有列中的特定值並將結果轉換爲列表。LINQ查詢以檢查表中所有列的謂詞

例如:

table.where(allcolumnvalue.contains(searchvalue)).Tolist() 

如何實現上述使用一個LINQ查詢。任何幫助深表感謝。

+1

聲音,如果你忘了規範化表,因爲你要尋找在不同列中的值,似乎這些都是相關的,所以你應該將它們存放在另一處表 –

+1

請說明樣本回答 –

回答

2

對於您的請求,所有的字段應該具有相同的類型,至少在靜態類型的C#中。

方法Queriable.Where獲取Expression<Func<T, bool>>謂詞作爲參數。所以你需要建立謂詞o.p1 == val || o.p2 == val || o.p3 = val ...作爲Expression的值。這裏oExpression<Func<T, bool>>參數:

public Expression BuildExpression<TObj, TVal>(TObj obj, TVal val) 
{ 
    Expression<Func<TObj, bool>> predicate = (o) => o.p1 == val || ... || o.pN == val; 
    return predicate; 
} 

,但我們需要動態地建立謂詞具有類型TValTObj所有屬性。

爲了簡化代碼,我們將構建等於false || o.p1 == val || ... || o.pN == val的表達式。

public Expression<Func<TObj, bool>> BuildExpression<TObj, TVal>(TVal val) 
{ 
    var parameter = Expression.Parameter(typeof(TObj), "o"); 
    var valExpression = Expression.Constant(val, typeof(TVal)); 
    var body = Expression.Constant(false, typeof(bool)); 

    var properties = typeof(TObj).GetProperties() 
           .Where(p => p.PropertyType == typeof(TVal)); 
    foreach (var property in properties) 
    { 
     var propertyExpression = Expression.Property(parameter, property); 
     var equalExpression = Expression.Equal(propertyExpression, valExpression); 
     body = Expression.Or(body, equalExpression); 
    } 

    return Expression.Lambda<Func<TObj, bool>>(body, parameter); 
} 

. . . 

using (var dbContext = new DbContext()) 
{ 
    var whereExpression = BuildExpression<User, string>("foo"); 
    var contaningsFoo = dbContext.Users.Where(whereExpression); 
} 
+0

在聲明body = Expression.Or(result,equalExpression)結果代表什麼?方法 – Alex

+1

@Alex首先,'body'存儲'false'值,然後存儲'false || o.p1 == val',然後是'false || o.p1 == val || o.p2 == val',依此類推。 –

+0

但是'結果'是什麼?我沒有看到在方法中的任何地方定義..預先感謝您! – Alex

0

我得到了答案,但不是完美的答案,但效果很好

public class GenericList<T> 
{ 
    void Add(T input) { } 

    public List<T> SerachFun(List<T> input, string search) 
    { 
     List<T> output = new System.Collections.Generic.List<T>(); 
     foreach (var aa in input) 
     { 
      var columns = aa.GetType().GetProperties().ToList(); 
      foreach (var bb in columns) 
      { 
       var cccc = bb.GetValue(aa); 
       bool result = cccc.ToString().Contains(search); 
       if (result) 
       { 
        output.Add(aa); 
        continue; 
       } 

      } 

     } 
     return output; 
    } 
} 

泛型類對象創建

 public GenericList<table1> g = new GenericList<table1>(); 

泛型類方法中調用:

var tabledetails=db.table1.ToList(); 
    var resultcommonsearch = g.SerachFun(tabledetails, "Dhoni"); 
0

使用代碼

public class GenericList<T> 
{ 
    public List<T> SerachFun(List<T> input, string search) 
    { 
      List<T> output = new System.Collections.Generic.List<T>(); 
      foreach (var aa in input) 
      { 
       var columns = aa.GetType().GetProperties().ToList(); 
       foreach (var bb in columns) 
       { 
        var cccc = bb.GetValue(aa); 
        if(cccc!=null) 
        { 
        bool result = cccc.ToString().Contains(search); 
        if (result) 
        { 
         output.Add(aa); 
         continue; 
         } 
        } 

       } 

     } 
      return output; 
    } 
    } 

嘗試調用方法

public GenericList<table1> g = new GenericList<table1>(); 

var tabledetails=db.table1.ToList(); 
var resultcommonsearch = g.SerachFun(tabledetails, "Dhoni");