簡體   English   中英

通用謂詞,可通過任何字符串屬性實現搜索

[英]Generic predicate to implement searching by any string property

是否可以通過實體的任何字符串屬性應用搜索? 我需要建立謂詞以在LINQ查詢數據庫中使用它。

var stringPropertyNames = typeof(T)
            .GetProperties()
            .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
            .Select(pi => pi.Name);

foreach (var item in stringPropertyNames)
{
    // here some code to build Predicate corresponding to sql LIKE statement
}

UPD:這是工作代碼:

public static IEnumerable<T> ContainsInAnyString<T>(IQueryable<T> collection, string query)
{
    var stringPropertyNames = typeof(T)
        .GetProperties()
        .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
        .Select(pi => pi.Name);

    var item = Expression.Parameter(typeof(T), "item");
    var searchArgument = Expression.Constant(query);
    var method = typeof(string).GetMethod("Contains", new[] { typeof(string) });

    foreach (var name in stringPropertyNames)
    {
        var currentProp = Expression.Property(item, name);
        var startsWithDishExpr = Expression.Call(currentProp, method, searchArgument);
        var lambda = Expression.Lambda<Func<T, bool>>(startsWithDishExpr, item);
        collection = collection.Where(lambda);
    }

    return collection;
}

希望對某人有幫助。

確實很簡單:

var entityParameter = Expression.Parameter(typeof(T), "entity");

return 
 Expression.Lambda<Func<T, bool>>
 (
   Expression.Equal
   (
     Expression.MakeMemberAccess(entityParameter, propertyInfo),
     Expression.Constant(valueToSearchBy)
   ),
   entityParameter
 );

當然,這確實是A == B 如果您想要A like '%' + B + '%' ,則必須將Expression.Equal更改為string.Contains 因為您還沒有展示任何作品,所以我將其留為練習:)

暫無
暫無

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

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