我有幾個自動完成操作,其中之一列出如下。我沒有爲每個自動完成Where
方法編寫不同的謂詞,而是創建了autoCompletePredicate
。由於我有多個autocompletes我使用反射來獲取該特定自動完成所需的屬性,並在我的autoCompletePredicate
中使用該屬性。使用表達式與Func
我有以下代碼工作正常。
static string param1, param2;
static PropertyInfo[] properties;
static PropertyInfo prop1, prop2;
public IHttpActionResult GetAutComplete(string term, string dependent)
{
int pagerSize = 10;
properties = new MyObject().GetType().GetProperties();
prop1 = properties.Where(p => p.Name.ToUpper().Equals("PROP1")).FirstOrDefault();
prop2 = properties.Where(p => p.Name.ToUpper().Equals("PROP2")).FirstOrDefault();
param1 = term;
param2 = dependent;
return Json(context.MyObject.Where(autoCompletePredicate).Select(r => new { label = r.PROP1 }).Distinct().OrderBy(r => r.label).Take(pagerSize).ToList());
}
Func<MyObject, int, bool> autoCompletePredicate = (GF, index) =>
{
bool isFound = false;
string term, dependent;
term = prop1.GetValue(GF).ToString();
dependent = prop2.GetValue(GF).ToString();
var termFound = term.Contains(param1.ToUpper());
var dependentFound = String.IsNullOrEmpty(param2) ? true : dependent.Contains(param2.ToUpper());
isFound = termFound && dependentFound;
return isFound;
};
如何將此代碼更改爲表達式。我想下面的代碼,編譯很好,但在運行時我有以下錯誤
public static Expression<Func<MyObject, bool>> AutoCompleteExpression()
{
return r => prop1.GetValue(r).ToString().Contains(param1.ToUpper()) && (String.IsNullOrEmpty(param2) ? true : prop2.GetValue(r).ToString().Contains(param2.ToUpper()));
}
「LINQ到實體無法識別方法‘System.Object的 的GetValue(System.Object的)’的方法,而這種方法不能將 轉換成商店表達。「
我看着下面post這使得絕對意義上的,但我不知道我該如何使用我的場景,例如(這是使用Reflection
動態查找屬性)。
另外,我想知道什麼可以利用使用表達式VS Func鍵(特別是在我的情況)什麼
提供商正試圖採取組合表達式增添了更大的靈活性表達式並從中創建SQL,在這種情況下不能使用它。你可以在Linq-to-Objects中執行這些表達式,但是它根本不清楚它應該做什麼。 –
@DStanley我在我的問題開始時提供了一些解釋。請看看它是否有意義。 – programmerboy