从方法返回部分linq查询-如何声明返回类型

本文关键字:何声明 声明 返回类型 返回部 方法 linq 查询 | 更新日期: 2023-09-27 18:04:45

我有一个用方法语法编写的linq查询。我需要创建一个非常相似的方法,只是对最终的选择做一些改变。

是否有可能从一个方法返回部分Linq查询,所以我不重复代码?我遇到的问题是找到查询的"类型"来标记方法。

如果我使用query.GetType(),它返回(精简版本):

SubSonic.Linq.Structure.Query`1[<>f__AnonymousType18`6[advert,client]]

我尝试创建一个返回类型:

SubSonic.Linq.Structure.Query<advert, client> query = new SubSonic.Linq.Structure.Query<advert, client>();

但是我收到错误:

Error   20  Using the generic type 'SubSonic.Linq.Structure.Query<T>' requires '1' type arguments   

所以我想我在问如何声明一个返回类型,这是一个亚音速查询包含一个匿名类型包含一些对象?(在我的例子中是2)

请原谅我简单的例子:

,

internal ????? GetQueryBody(string param1, string param2){
    /*  buld the linq query here */
}
internal List<Booking> GetSearchResultsOne(string param1, string param2){
  var query = this.GetQueryBody(string param1, string param2);
  var res = query.Select( db => new Booking { /*fields */).ToList();
  return res;
}
internal List<BookingData> GetSearchResultsTwo(string param1, string param2){
  var query = this.GetQueryBody(string param1, string param2);
  var res = query.Select( db => new BookingData { /*fields*/).ToList();
  return res;
}

感谢您的宝贵时间,

Yohimbo

从方法返回部分linq查询-如何声明返回类型

使用IEnumerable<T>返回查询

关于匿名类型:如果一个类型是匿名的,另一个方法如何知道它?点击这里阅读更多内容。要解决这个问题,可以通过创建一个类来为匿名类型命名。

如果你只想返回两个类型,你也可以返回一个元组:那么TTuple<advert,client>。可以通过

创建元组
var t = new Tuple<advert,client>(client, advert);

答案1:你不能这样做,因为Booking和BookingData是不同的类型,所以表达式树是不同的。

答案2:假设你能找到一个公共基类,有两种方法可以解决你的问题。

  1. Linq查询的"类型"实际上是一个Expression<TDelegate>。您可以构造表达式树并存储和操作它们,然后在需要时使用它们。

  2. 最终Select()的"参数"实际上是一个Expression<Func<TSource, TResult>>。你可以在那个位置使用任何函数,只要它符合那个委托。

换句话说,您可以从顶部存储整个预形成的表达式树,或者您可以存储一个树并替换底部的位。您的示例中没有足够的内容让我编写代码,而且您仍然必须解决这个致命缺陷。