如何在LINQ查询的where子句中调用方法/函数作为IEnumerable对象

时间:2015-12-11 09:36:50

标签: c# linq

我有问题在linq查询的<body ng-app="app" ng-controller="testCtrl"> <div ng-repeat="test in tests"> &lt;p&gt;{{test.test}}&lt;/p&gt; </div> </body> 子句中使用函数,如下面的代码所示。

  1. 返回where对象的函数:

    IEnumerable
  2. 返回private IEnumerable filterparameter(string filter) { EmailAflAwmMessageDM obj = new EmailAflAwmMessageDM(); if (filter == "attachments") { return obj.attachments; } else if (filter == "flagged") { return obj.flagged; } else { return obj.seen; } } 的函数,将在web api函数中使用:

    IQuerable
  3. 更新:此错误

    private IQueryable SearchFilterCondition(string filter,string value)
    {
        var emailmessage = from a in db.EmailAflAwmMessage
                           where (filterparameter(filter) == value)
                           orderby a.msg_date descending
                           select new
                           {
                               a.subject,
                               a.msg_date,         
                           };
        return emailmessage;
    }
    

    请帮助我解决此问题或指导我使用替代方案。

2 个答案:

答案 0 :(得分:4)

作为@Domysee提到你不能在Linq查询中调用任何c#函数。只有EntitiFunctions 这就是为什么表达式已经构建的原因。要在linq查询中使用

        public Expression<Func<EmailAflAwmMessage, bool>> GetSelectXpr(string filter, string value)
        {
            if (filter == "attachments")
                return e => e.attachments == value;
            else if (filter == "flagged")
                return e => e.flagged == value;
            else
                return e => e.seen == value;
        }

使用。

var selectXpr = GetGetSelectXpr(filter,value);
    var emailmessage = db.EmailAflAwmMessage.Where(selectXpr).OrderByDescending(a=>a.msg_date).Select(a=> 
     new {
     a.subject,
     a.msg_date
   })

答案 1 :(得分:3)

不幸的是,在Where的{​​{1}}内使用方法是不可能的,因为Linq to SQL无法知道如何将方法转换为SQL。

您必须将方法内嵌到IQueryable才能使其正常工作 这样的事情:

Where