如何爲此類實體框架創建屬性選擇器?如何在ef6中構建簡單的屬性選擇器表達式
public static List<T> StandardSearchAlgorithm<T>(this IQueryable<T> queryable, Func<T, string> property, string query)
{
return queryable.Where(e => property(e).ToLower().IndexOf(query) > -1).ToList();
}
我想調用代碼能夠乾淨,簡單的像這樣:
var usernameResults = _db.Users.StandardSearchAlgorithm(u => u.Username, query);
我得到一個「的LINQ表達式節點類型‘調用’不是在LINQ支持到實體。 「錯誤。我無法弄清楚如何獲得構建的表達式。
UPDATE:
基於由這裏MBoros答案是我最終的代碼。它效果很好。表達樹的關鍵是理解表達式樹都是關於將你通常在代碼中寫入的內容(如「e => e.Username.IndexOf(query)」)分解爲一系列對象:「e」獲取自己的對象,「Username」自己的對象,「IndexOf()」自己的對象,「查詢」常量自己的對象,等等。第二個關鍵是要知道您可以在類Expression
上使用一系列靜態方法來創建各種這些對象,如下所示。
PropertyInfo pinfo = (PropertyInfo)((MemberExpression)property.Body).Member;
ParameterExpression parameter = Expression.Parameter(typeof(T), "e");
MemberExpression accessor = Expression.Property(parameter, pinfo);
ConstantExpression queryString = Expression.Constant(query, typeof(string));
ConstantExpression minusOne = Expression.Constant(-1, typeof(int));
MethodInfo indexOfInfo = typeof(string).GetMethod("IndexOf", new[] { typeof(string) }); // easiest way to do this
Expression indexOf = Expression.Call(accessor, indexOfInfo, queryString);
Expression expression = Expression.GreaterThan(indexOf, minusOne);
Expression<Func<T, bool>> predicate = Expression.Lambda<Func<T, bool>>(expression, parameter);
//return predicate.Body.ToString(); // returns "e => e.Username.IndexOf(query) > -1" which is exactly what we want.
var results = queryable.Where(predicate).ToList();
return results;
現在我有一個真正的問題,但我會問一個單獨的問題。我真正的查詢是這樣的:
public static List<T> StandardSearchAlgorithm<T>(this IQueryable<T> queryable, Func<T, string> property, string query)
{
return queryable.Where(e => property(e).IndexOf(query) > -1).Select(e=> new { Priority = property(e).IndexOf(query), Entity = e }).ToList();
}
所以我需要建立一個表達式,返回一個匿名類型!或者即使我創建一個類來幫助,我需要編寫一個返回一個新對象的表達式。但我會在另外一個問題中加入這個。
你可能想看看[PredicateBuilder(http://www.albahari.com/nutshell/predicatebuilder.aspx)來幫你做這 – DLeh
誰之前發佈答案的人。這工作!謝謝神祕人刪除了你的帖子。 –
我刪除了我的答案,因爲它實際上並沒有編譯到SQL,它只是在內存中。我正在研究如何使其正確編譯爲sql。稍微檢查一下,希望我會有一個工作答案。 – DLeh