返回IQueryable<;动态>;以在父方法中进行筛选
本文关键字:方法 筛选 lt IQueryable 动态 gt 返回 | 更新日期: 2024-10-23 04:52:48
例如,我有以下代码:
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>
时,会出现"表达式树可能不包含动态操作"错误。如果我将其更改为IQueryable<object>
,那么我在oneItem
中的过滤就不起作用。
您需要返回
IQueryable<MyObject>
你可以通过使用genrics(例如)来干燥你的方法/类
IQuerable<T> GetQueryable()
然后消费者可以指定T应该是什么以及您的离开。
不能将dynamic与linq一起使用。请参阅此处了解原因。
对于两个进行通信的方法,它们必须理解相同的类型,因此您确实希望投影到命名类型中。
如果你坚持使用动态编程,这是可以做到的,但你需要大量的铸造,因为动态不是一种类型,只是处理对象的一种方式:
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();