簡體   English   中英

Expression.Call,Int32和Enum

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM