返回IQueryable <dynamic>以在父方法</dynamic>中过滤

时间:2015-03-07 12:46:19

标签: c# linq

例如,我有这段代码:

      IQueryable<MyModel> q = new List<MyModel>().AsQueryable(); // this is just an example, this is obviously not a list

      var query = from item in q select new { item.Property };

      var oneItem = query.FirstOrDefault(x => x.SomeProperty == somevalue);
      var allItems = query.ToArray();

现在情况有点复杂,我需要用两种不同的方法获得oneItemallItems。因此,要关注DRY,我想将查询移至私有方法,然后在消费方法中根据需要调用this.GetQuery().FirstOrDefault().ToArray()

然而,当我尝试将方法设为IQueryable<dynamic>时,我得到了&#39;表达式树可能不包含动态操作&#39;错误。如果我将其更改为IQueryable<object>,那么oneItem中的过滤功能无效。

2 个答案:

答案 0 :(得分:1)

您需要返回

IQueryable<MyObject>

您可以使用genrics(例如

)使您的方法/类干燥
IQuerable<T> GetQueryable()

然后消费者可以指定T应该是什么以及你的离开。

你不能在linq上使用dynamic。请参阅here以了解原因。

答案 1 :(得分:0)

对于两种沟通方法,他们必须理解相同的类型,因此你真的想要投射到命名类型。

如果你坚持使用动态编程,它可以完成,但是你需要大量的转换,因为dynamic不是一种类型,而只是一种处理对象的方式:

IQueryable<MyModel> q = new List<MyModel>().AsQueryable(); // this is just an example, this is obviously not a list

      IQueryable<object> query = from item in q select (object)new { item.Property };

      var oneItem = query.FirstOrDefault(x => ((dynamic)x).SomeProperty == somevalue);
      object[] allItems = query.ToArray();