我想創建,我可以用它來查詢(在這種情況下,患者實體)爲父屬性子實體LINQ表達式,使用這種方法:LINQ到SQL表達式母公司
private IQueryable<LAB_ORDER> SelectFilter(string fieldName, string value)
{
var param = Expression.Parameter(typeof(PATIENT), "item");
var field = Expression.PropertyOrField(param, fieldName);
var search = Expression.Constant(value, typeof(string));
var body = Expression.Call(field, "Contains", null, search);
Expression<Func<LAB_ORDER, bool>> lambda;
if (String.IsNullOrEmpty(value))
{
lambda = x => true;
}
else
{
lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm);
}
var linqFilter = from e in context.LAB_ORDERS select e;
return linqFilter.Where(lambda);
}
外貌喜歡它建立正確的表達,但異常我得到的是:
System.ArgumentException: 的類型「患者 ParameterExpression不能被用於類型LAB_ORDER的委託參數 」。
雖然我可以沒有任何問題做linqFilter.Where(X => x.PATIENT.LAST_NAME ==「史密斯」),不能使用上述表達式,這應該轉換爲與此類似。我如何修復上述表達式來糾正它?我急切地向孩子加載父母實體,所以這不成問題。
編輯
安德斯回覆它看起來像我需要修改lambda表達式:
lambda = Expression.Lambda<Func<PATIENT, bool>>(body, parm);
現在,當我嘗試使用它,linqFilter.Where(拉姆達)給我編譯錯誤「沒有合適的超載」,我明白爲什麼 - linqFilter是 "IQueryable<LAB_ORDER>", not "IQueryable<PATIENT>",
所以我應該怎麼做? 只是總結一下,唯一的問題仍然是 - 如何爲父屬性創建表達式?
感謝您的回覆安德斯。這是完全正確的 - 我試圖表達x => x.PATIENT。[fieldName] .Contains()。但如果我嘗試var param = Expression.Parameter(typeof(LAB_ORDER),「item」);那麼我會在下一行出現異常:var field = Expression.PropertyOrField(param,「PATIENT.LAST_NAME」); - 「PATIENT.LAST_NAME不是LAB_ORDER的成員,你能告訴我如何修改lambda表達式嗎?謝謝 – Victor 2010-03-03 20:31:57
另外,如果我改變我的lambda爲 lambda = Expression.Lambda>(body, parm);然後 linqFilter.Where(lambda)給我編譯錯誤 - 沒有合適的重載 –
Victor
2010-03-03 20:57:12
你不能使用Expression.PropertyOrField(param,「PATIENT.LAST_NAME」);你必須建立一個嵌套的表達式,首先挑出這個是LAB_ORDER,然後是來自病人的LAST_NAME。 – 2010-03-04 07:55:35