讓我們假設我們需要在實體列表上進行查詢,並且我們不知道那些非常動態的標準,並且實體內部有字典和簡單字段讓這是下一個實體 - 地址(爲簡單起見,我只留下了一個屬性)。動態編譯LINQ查詢以驗證字典值
public class Address
{
#region Public members
/// <summary>
/// The extra datafield values
/// </summary>
public IDictionary<string, string> DataFieldValues { get; set; }
public string City { get; set; }
#endregion
}
現在,如果我們查詢名爲市固定字段時,我得到了實現:
private static Expression<Func<Address, bool>> BuildLambdaForAQueryItem(string caption, string value)
{
ParameterExpression param = Expression.Parameter(typeof(Address), caption);
BinaryExpression body = Expression.Equal(Expression.PropertyOrField(param, caption),
Expression.Constant(value,
typeof(Address).GetProperty(
caption).PropertyType));
return Expression.Lambda<Func<Address, bool>>(body, param);
}
現在,如果我想在DataFieldValue coolection查詢我需要寫一個lambda也類似:
x => x.DataFieldValues.ContatinsKey(key)& & DataFieldValues [key] = =值 我得到下面的方法幾乎similar但仍不適正確的過濾器:在兩個謂語表達式
private static Expression<Func<Address, bool>> BuildLambdaForAnExtraField(PostedQueryItem queryItem)
{
ParameterExpression dataFields = Expression.Parameter(typeof(Address), "x");
var dictionaryExpression = Expression.PropertyOrField(dataFields, "DataFieldValues");
var keyExists = Expression.Call(dictionaryExpression, "ContainsKey", null, Expression.Constant(queryItem.Caption));
Expression dictionaryAccessExpr = Expression.Property(dictionaryExpression, "Item",
Expression.Constant(queryItem.Caption));
var valueCorresponds = Expression.Equal(dictionaryAccessExpr, Expression.Constant(queryItem.Value));
return Expression.Lambda<Func<Address, bool>>(keyExists, dataFields).And(
Expression.Lambda<Func<Address, bool>>(valueCorresponds, dataFields));
}
你說得對,謝謝。但我仍然不明白爲什麼我以前的實現沒有解決 –
@Hohhi:我已經編輯了一個解決方案。 – Ani
感謝您提供快速而全面的幫助 –