簡體   English   中英

LINQ查詢以檢查表中所有列中的謂詞

[英]LINQ Query to check for a predicate in all columns in a table

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

例如:

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

如何使用一個LINQ查詢完成上述操作。 任何幫助深表感謝。

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

方法Queriable.Where得到Expression<Func<T, bool>>謂詞作為參數。 所以你需要構建謂詞o.p1 == val || o.p2 == val || o.p3 = val ... o.p1 == val || o.p2 == val || o.p3 = val ... 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;
}

但是我們需要動態地為具有TObj類型的TVal所有屬性構建謂詞。

為了簡化代碼,我們將構建相等的表達式false || o.p1 == val || ... || o.pN == val false || o.p1 == val || ... || o.pN == val 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);
}

我得到了答案但是不是完美的答案但是工作得很好

   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");

使用代碼

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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM