【问题标题】:Return an IQueryable<dynamic> to filter in the parent method返回一个 IQueryable<dynamic> 以在父方法中进行过滤
【发布时间】:2015-03-07 21:36:47
【问题描述】:

例如,我有这样的代码:

      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&lt;dynamic&gt; 的方法时,我收到“表达式树可能不包含动态操作”错误。如果我将其更改为IQueryable&lt;object&gt;,那么我在oneItem 中的过滤将不起作用。

【问题讨论】:

  • 'item.Property 的类型是什么?
  • @JenishRabadiya in prod 我选择了大约 22 个属性 - Guid?、DateTime?、string、int?、double、Boolean?。

标签: c# linq


【解决方案1】:

你需要返回

IQueryable<MyObject>

您可以通过使用泛型来使您的方法/类变得干燥,例如

IQuerable<T> GetQueryable()

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

您不能在 linq 中使用动态。请参阅here 了解原因。

【讨论】:

  • 我正在选择一个匿名类型,如您在我的示例中所见。所以没有我想要返回的类型。
  • 为什么一定要匿名?这是什么原因?
  • 我有几十个复杂的查询我想像这样公开,它们可以非常迅速地改变。我不想纯粹地创建和维护对象,这样我就可以在类中重用查询。
  • 您是否从数据库中检索项目您是否使用实体框架?
  • OK 无论哪种方式,您都不能将动态与 linq 一起使用,它不起作用。我已经更新了答案
【解决方案2】:

对于两种通信方法,它们必须理解相同的类型,所以你真的想投影到一个命名的类型中。

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

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

【讨论】:

  • 不幸的是,在此处转换为动态时,我再次收到“表达式树可能不包含动态操作”:var oneItem = query.FirstOrDefault(x =&gt; ((dynamic)x).SomeProperty == somevalue);
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多