2010-03-03 200 views
1

我想創建,我可以用它來查詢(在這種情況下,患者實體)爲父屬性子實體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>",所以我應該怎麼做? 只是總結一下,唯一的問題仍然是 - 如何爲父屬性創建表達式?

回答

2

在下面的語句中,你說你將建立一個函數,它接受一個LAB_ORDER參數並返回一個布爾值。

lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm); 

但是,parm變量包含一個患者。您將不得不重寫表達式lambda以代替LAB_ORDER。如果我理解你的意圖,你正確你想表達的表達是

x => x.PATIENT.[fieldnName].Contains() 

,但你已經建立了表達

x => x.[fieldName].Contains() 
+0

感謝您的回覆安德斯。這是完全正確的 - 我試圖表達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

+0

另外,如果我改變我的lambda爲 lambda = Expression.Lambda >(body, parm);然後 linqFilter.Where(lambda)給我編譯錯誤 - 沒有合適的重載 – Victor 2010-03-03 20:57:12

+0

你不能使用Expression.PropertyOrField(param,「PATIENT.LAST_NAME」);你必須建立一個嵌套的表達式,首先挑出這個是LAB_ORDER,然後是來自病人的LAST_NAME。 – 2010-03-04 07:55:35