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

问题描述 投票:0回答:2

我有一个用方法语法编写的linq查询。我需要创建一个非常类似的方法,只需对最终的Select进行一些更改。

是否可以从方法返回部分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   

所以我想我问的是如何声明一个返回类型,它是一个包含一个包含多个对象的匿名类型的Subsonic Query? (在我的例子中为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

c# linq subsonic3 anonymous-types
2个回答
1
投票

使用IEnumerable<T>返回查询。

关于匿名类型:如果一个类型是匿名的,那么另一个方法应该怎么知道呢?阅读更多here。要解决此问题,请通过创建类为您的匿名类型指定名称。

如果你只想返回两种类型,你也可以返回一个元组:然后TTuple<advert,client>。你可以创建一个元组

var t = new Tuple<advert,client>(client, advert);

1
投票

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

答案2:假设您可以找到一个共同的基类,您的问题有两种方法。

  1. Linq Query所起作用的“类型”实际上是一个Expression<TDelegate>。您可以构造表达式树并存储它们并对其进行操作,然后在需要时使用它们。
  2. 你最后的Select()的'参数'实际上是一个Expression<Func<TSource, TResult>>。只要符合该委托,您就可以使用该位置的任何功能。

换句话说,您可以从顶部存储整个预先形成的表达式树,或者您可以存储一个树并替换底部的位。你的样本中没有足够的代码来编写代码,你仍然必须解决这个致命的缺陷。

© www.soinside.com 2019 - 2024. All rights reserved.