例如,我有这段代码:
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();
现在情况有点复杂,我需要用两种不同的方法获得oneItem
和allItems
。因此,要关注DRY,我想将查询移至私有方法,然后在消费方法中根据需要调用this.GetQuery().FirstOrDefault()
或.ToArray()
。
然而,当我尝试将方法设为IQueryable<dynamic>
时,我得到了&#39;表达式树可能不包含动态操作&#39;错误。如果我将其更改为IQueryable<object>
,那么oneItem
中的过滤功能无效。
答案 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();