Создание универсального метода в IEnumerableC#

Место общения программистов C#
Ответить
Anonymous
 Создание универсального метода в IEnumerable

Сообщение Anonymous »

Хорошо, немного вводной информации.
У меня был метод, который выглядит следующим образом:

Код: Выделить всё

private static IEnumerable Yield(this IEnumerable models, int numberResults) => numberResults > 0 ? models.Take(numberResults) : models;
и это отлично сработало для моего проекта. Мой проект не использовал Entity Framework. Но теперь у него есть Identity Framework, и поэтому он теперь использует Entity Framework.

Теперь мне нужно составить список некоторых Пользователей, но я использую ту же самую функцию, описанную выше.
Мой метод для этого выглядит следующим образом:

Код: Выделить всё

public async Task ListByQueryAsync(string query, int yield)
{

// Put our query in lowercase
var loweredQuery = query.ToLower();

// Get our users and search
var users = base.Users.Where(m => m.UserName.ToLower().Contains(loweredQuery) || m.FirstName.ToLower().Contains(loweredQuery) || m.LastName.ToLower().Contains(loweredQuery)); //.Yield(yield);

// Return our users as a list
return await users.Select(m => UserFactory.Create(m)).ToListAsync();
}
переменная users — это IQueryable, которая (если я прав) реализует IEnumerable, а также, если она преобразуется в какой-либо конкретный класс, она выполнит SQL. Поэтому я хотел бы получить список пользователей, а затем использовать свой статический метод, чтобы получить количество результатов.
Сначала я просто скопировал метод выше и написал следующее:

Код: Выделить всё

private static IQuerable Yield(this IQuerable models, int numberResults) => numberResults > 0 ? models.Take(numberResults) : models;
Это прекрасно работает, но, будучи сторонником принципов DRY, я решил, что повторил тот же метод, поэтому я решил, что, поскольку IQuerable реализует IEumerable, я смогу написать частный метод, который может обрабатывать общедоступные методы бота. Поэтому я написал это:

Код: Выделить всё

public static class LinqExtensions
{
public static IEnumerable Yield(this IEnumerable models, int numberResults) => models.YieldEnumerable(numberResults);
public static IQueryable Yield(this IQueryable models, int numberResults) => models.YieldEnumerable(numberResults);

/// 
/// Lists database entities by a number of results or lists them all
/// 
/// The generic entity to list
/// 
The query to yield
/// The number of results to yield
/// 
private static IEnumerable YieldEnumerable(this IEnumerable models, int numberResults) => numberResults > 0 ? models.Take(numberResults) : models;
}
И теперь я получаю сообщение об ошибке:


Невозможно неявно преобразовать тип «System.Collections.Generic.IEnumerable» в «System.Linq.IQuerable».


Я мог бы привести IQueryable как список или что-то в этом роде, но это означало бы, что мой метод Yield фактически выполнил бы SQL, а я не хочу, чтобы он это делал.
Кто-нибудь знает, как обойти эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/433 ... enumerable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»