我想創建一個基於自己的id獲取EntityFramework對象而不傳入lambda表達式作爲參數的方法GetById()
的通用方法。對於下面的代碼,實體T
的類型爲Message
,對GetById()
已實現的類已知,並且具有屬性MessageId
以及其他幾個屬性。 MessageId
名稱已在下面的示例中進行了硬編碼,因爲這仍然是實驗性的 - 從T
中提取id屬性名稱在以後很容易修復。使用Func構建LambdaExpression <,>其中returnType是IQueryable <T>
我一直在努力尋找一種方法來構建一個簡單的LambdaExpression
,其中IQueryable<T>
作爲參數類型,並希望有人會有這樣的線索可以完成。我想要IQueryable<T>
的原因是因爲我的底層渠道工廠提供程序需要此更復雜的查詢。
在下面的代碼var exp = Expression.Lambda<...>
行示出了我想與落得表達式函數類型定義,但行給出了異常:
不能用於返回類型System.Boolean的表達鍵入IQueryable的
這是因爲體內有Boolean
類型,而我的表情參數queryParamtRet
是IQueryable<Message>
類型。此外,如果我將主體類型更改爲IQueryable<Message>
,我無法找到屬性MessageId
,因爲該類型不再輸入T
,而是Message
,但輸入的類型爲IQueryable<T>
。
public T GetById(int id)
{
var queryParamLeft = Expression
.Parameter(typeof(System.Data.Entity.DbSet<T>), "o");
var queryParamRet = Expression
.Parameter(typeof(IQueryable<T>), "o");
var entityFrameworkType = Expression
.Parameter(typeof(T), "o");
var queryProperty = Expression
.PropertyOrField(entityFrameworkType, "MessageId");
var body = Expression
.Equal(queryProperty, Expression.Constant(id));
var exp = Expression
.Lambda<Func<System.Data.Entity.DbSet<T>, IQueryable<T>>>(
body,
queryParamRet);
var returnXml = DoWithChannel(channel
=> channel.Load(serializer.Serialize(exp)));
}
它看起來像你缺少的一步你表達式 - 如果它在c#中被編寫爲LINQ語句,它會是什麼樣子? 'dbSet.Where(o => o.MessageId == id)'也許? – Rhumborl
您錯過了'Expression.Call(Queryable.Where,Expression.Lambda <...>)' – Aron