«Выбор» или «Обтекание» IQueryable, чтобы он по-прежнему можно было запрашивать - PullRequest
2 голосов
/ 31 марта 2011

У меня есть Class / API, который использует источник данных IQueryable<FirstClass>, однако я хочу предоставить IQueryable<SecondClass>, где SecondClass - это класс-оболочка для FirstClass, который предоставляет почти идентичные свойства, однако по разным причинам это необходимонаследовать от несвязанного базового класса.Например:

// My API
void IQueryable<SecondClass> GetCurrentRecords()
{
    return from row in dataSource
           /* Linq query */
           select new SecondClass(row);
}

// User of my API
var results = GetCurrentRecords().Where(row => row.Owner = "Mike");

Теперь я могу сделать вышеупомянутую компиляцию, просто используя AsQueryable, однако я хочу выставить "true" IQueryable, который эффективно запрашивает базу данных на основе запроса пользователей API.

Я знаю, что это не тривиально (моя реализация оболочки IQueryable должна понимать взаимосвязь между свойствами SecondClass и FirstClass) и что она не имеет ничего общего с функцией Select,но это кажется так, как это должно быть возможно.

Как мне это сделать?

Примечание: Я знаю, что вместо этого мой API мог просто выставитьFirstClass вместе с вспомогательным методом для преобразования FirstClass в SecondClass, когда пользователь API "готов" создает свой запрос, но это выглядит грязно, и мне не нравится идея выставлять мои сгенерированные классы таким образом,Кроме того, я бы хотел знать, как это сделать, просто с чисто академической точки зрения.

1 Ответ

0 голосов
/ 20 декабря 2011

Возможно, вы должны вернуть не IQueriable, а Expression.Затем вы сможете изменить выражение и позволить LINQ сгенерировать запрос из конечного объекта Expression.Пример здесь: http://msdn.microsoft.com/en-us/library/bb882637.aspx

...