Возврат частичного запроса linq из метода - как объявить тип возвращаемого значения - PullRequest
0 голосов
/ 08 августа 2011

У меня есть запрос 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;
}

Спасибо за ваше время,

Йохимбо

Ответы [ 2 ]

1 голос
/ 04 января 2012

Ответ 1: Вы не можете сделать это, потому что Booking и BookingData - это разные типы, поэтому деревья выражений разные.

Ответ 2: Предполагая, что вы можете найти общий базовый класс, есть два подхода к вашемувопрос.

  1. «Тип» того, на что действует запрос Linq, на самом деле Expression<TDelegate>.Вы можете создавать деревья выражений, хранить их и манипулировать ими, а затем использовать их там, где это необходимо.

  2. «Аргумент» для вашего последнего метода Select () на самом деле является Expression<Func<TSource, TResult>>.Вы можете использовать любую функцию в этом месте, если она соответствует этому делегату.

Другими словами, вы можете хранить все предварительно сформированные деревья выражений сверху или можетеХраните одно дерево и подставьте бит внизу.В вашем образце недостаточно для того, чтобы я написал код, и вам все еще нужно устранить этот фатальный недостаток.

1 голос
/ 08 августа 2011

Используйте IEnumerable<T> для возврата запроса.

Об анонимном типе: если тип является анонимным, как другой метод должен знать об этом?Подробнее здесь .Чтобы решить эту проблему, присвойте своему анонимному типу имя, создав класс.

Если вы хотите вернуть только два типа, вы также можете вернуть кортеж: Тогда T равно Tuple<advert,client>.Вы можете создать кортеж по

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