返回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();

现在,在更复杂的情况下,我需要用两种不同的方法获得oneItemallItems。因此,为了遵循DRY,我想将查询移动到一个私有方法,然后在消费方法中,根据需要只调用this.GetQuery().FirstOrDefault().ToArray()

但是,当我尝试将方法设置为IQueryable<dynamic>时,会出现"表达式树可能不包含动态操作"错误。如果我将其更改为IQueryable<object>,那么我在oneItem中的过滤就不起作用。

返回IQueryable<;动态>;以在父方法中进行筛选

您需要返回

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();