我有一個包含30列的表, ,它包含1000行。 我想要一個LINQ查詢,它將檢查所有列中的特定值並將結果轉換爲列表。LINQ查詢以檢查表中所有列的謂詞
例如:
table.where(allcolumnvalue.contains(searchvalue)).Tolist()
如何實現上述使用一個LINQ查詢。任何幫助深表感謝。
我有一個包含30列的表, ,它包含1000行。 我想要一個LINQ查詢,它將檢查所有列中的特定值並將結果轉換爲列表。LINQ查詢以檢查表中所有列的謂詞
例如:
table.where(allcolumnvalue.contains(searchvalue)).Tolist()
如何實現上述使用一個LINQ查詢。任何幫助深表感謝。
對於您的請求,所有的字段應該具有相同的類型,至少在靜態類型的C#中。
方法Queriable.Where
獲取Expression<Func<T, bool>>
謂詞作爲參數。所以你需要建立謂詞o.p1 == val || o.p2 == val || o.p3 = val ...
作爲Expression
的值。這裏o
是Expression<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;
}
,但我們需要動態地建立謂詞具有類型TVal
的TObj
所有屬性。
爲了簡化代碼,我們將構建等於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");
聲音,如果你忘了規範化表,因爲你要尋找在不同列中的值,似乎這些都是相關的,所以你應該將它們存放在另一處表 –
請說明樣本回答 –