[英]Expression.Call, Int32 and Enum
無法弄清楚如何構建將枚舉類型與整數進行比較的表達式。 我有一個嵌入Kendo組件的MVC網站。 在視圖類中,屬性為ENUM,但視圖返回Int32(源為Kendo IFilterDescriptor)。
所以問題是...:我從視圖中接收到一個int,構建表達式,由於期望枚舉,該操作失敗。 通過將int轉換為其枚舉表示形式來解決此問題,但是由於數據庫需要Int32,因此在查詢數據庫時失敗。
public static Expression<Func<DOMAIN, bool>> GetExpressionsFromFilterDescription<DOMAIN, VIEW>(this IEnumerable<IFilterDescriptor> _this)
{
Expression expressions = null;
ParameterExpression pe = Expression.Parameter(typeof(DOMAIN), "x");
foreach (FilterDescriptor item in _this)
{
MemberExpression member = Expression.Property(pe, item.Member);
ConstantExpression value = Expression.Constant(item.Value);
Expression exp = null;
switch (item.Operator)
{
case FilterOperator.IsEqualTo:
exp = Expression.Equal(member, value);
據我了解,Expression.Call()應該可以解決此問題,但我只是想不出如何做到這一點。
任何幫助,將不勝感激。
彼得
更新
像下面那樣轉換值,確實解決了表達式問題(“類型未定義二進制運算符Equal ...”錯誤),但是隨后我在查詢數據庫時遇到了一個新錯誤:“ NHibernate.Criterion中的類型不匹配。 SimpleExpression:狀態預期類型為System.Int32,實際類型為...”。
exp = Expression.Equal(member, Expression.Convert(value, typeof(MyEnum)));
如我所見,此修復程序是通過建立自己的比較(Expression.Call?)或通過告知類型(在item.Member中)是int而非枚舉來實現的,但我不知道該怎么做或是否這是正確的方法。 謝謝。
更新更新
問題的第二部分似乎是由於NHibernate.QueryOver及其局限性引起的。 一旦更改為NHibernate.Linq,問題的查詢部分就消失了。
至於表達式部分,我通過在屬性中添加一個屬性來說明應如何轉換值,從而解決了該問題。 我沒有使用Expression.Convert(但我可以使用),在生成表達式之前,轉換發生在接收到的過濾器描述中。
感謝您的時間和幫助。 我將接受與Expression.Convert相關的答案,因為它可以解決問題。 我仍然想了解Expression.Call()方法-因此請隨時對此發表評論。 謝謝。
您可以使用Expression.Convert
將枚舉type to an
的表達式轉換為int`(假設枚舉的基礎類型是int)。
這不會成功嗎?
MemberExpression member = Expression.Convert(
Expression.Property(pe, item.Member), typeof(int);
ConstantExpression value = Expression.Constant((int)item.Value);
我沒有看到您正在比較的枚舉,它是item.Value嗎?
您始終可以將枚舉的值強制轉換為數字,以將其與數字進行比較或將其輸入不識別枚舉的系統中:
enum Blah
{
Tom,
Rick,
Harry
}
if ((Int32)Blah.Tom == 0)
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.