我最近在執行運行時動態創建Linq表達式時遇到了這個問題。我發現的大多數例子都是處理比較簡單的任務,只是將給定數據庫實體的一個屬性與單個參數進行比較。像這樣:創建一個動態包含子查詢的Linq表達式
Session.Query.Where(m => m.Name.Contains("test"))
這也可以用這樣一個更爲通用的方法來實現:
var item = Expression.Parameter(typeof (MyClass), "item");
var property = Expression.Property(item, "Name");
var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var searchExpression = Expression.Constant(searchString, typeof(string));
var containsMethodExpression = Expression.Call(property, containsMethod, searchExpression);
var lambda = Expression.Lambda<Func<MyClass, bool>>(containsMethodExpression, item);
query = query.Where(lambda);
但是,有時任務是較爲複雜的,一個人想獲得的東西像下面這樣:
Session.Query.Where(m => m.SpecialProperty.Any(f => f.Name.Contains("test")));
其中「SpecialProperty」是類型列表<>和「名稱」屬性的是字符串類型。
是否有可能像這樣動態創建一個Linq表達式,以及如何實現?這種方法是否有任何性能問題?