Ok、少しの背景情報。 私はこのようになります方法だった:IEnumerableでジェネリックメソッドを作成する
private static IEnumerable<T> Yield<T>(this IEnumerable<T> models, int numberResults) => numberResults > 0 ? models.Take(numberResults) : models;
を、これは私のプロジェクトのための罰金働いていました。私のプロジェクトはで、ではなく、エンティティフレームワークです。しかし今ではIdentity Frameworkを持っていて、今度はエンティティフレームワークを使用しています。
ユーザーをリストする必要がありますが、上記の同じ機能を使用します。
public async Task<List<UserViewModel>> 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();
}
ユーザー変数がIEnumerableをを実装し、またそれがどの具体的なクラスに変換されている場合、それが実行されます(私は正しいだ場合)のIQueryableです: そのための私の方法は、このようになります。だから私はユーザーのリストを取得したいと思いますへの私の静的メソッドを使用して結果の量はです。 最初に私は単純に上記の方法をコピーして、これを書いた:
private static IQuerable<T> Yield<T>(this IQuerable<T> models, int numberResults) => numberResults > 0 ? models.Take(numberResults) : models;
これは正常に動作しますが、私は、私は同じ方法を繰り返していることを決定したDRY原則の提唱者であること、私はIQuerable実装しているため考え出しIEumerable私はボットのパブリックメソッドを扱うことができるプライベートメソッドを書くことができます。だから私は、この書いた:
public static class LinqExtensions
{
public static IEnumerable<T> Yield<T>(this IEnumerable<T> models, int numberResults) => models.YieldEnumerable(numberResults);
public static IQueryable<T> Yield<T>(this IQueryable<T> models, int numberResults) => models.YieldEnumerable(numberResults);
/// <summary>
/// Lists database entities by a number of results or lists them all
/// </summary>
/// <typeparam name="T">The generic entity to list</typeparam>
/// <param name="models">The query to yield</param>
/// <param name="numberResults">The number of results to yield</param>
/// <returns></returns>
private static IEnumerable<T> YieldEnumerable<T>(this IEnumerable<T> models, int numberResults) => numberResults > 0 ? models.Take(numberResults) : models;
}
をそして今、私はというエラーを取得:
が暗黙のうちに 'System.Linq.IQuerable' にタイプ 'System.Collections.Generic.IEnumerable' を変換できません。
私はリストか何かとしてのIQueryableを唱えられるが、それは私の収量方法は、実際にSQLを実行しますと、私はそれはそれを行うにはしたくないことを意味します。 誰もこの問題を回避する方法を知っていますか?
注:やっ 'のpublic staticのIQueryable収量(本のIQueryable モデルは、int型はnumberResults)=> models.YieldEnumerable(はnumberResults).AsQueryable()を;'あまりにも行うことが悪いとなってAVEでしょう。これにより、データベースはすべての行をクライアントに返し、メモリ内で '.Take'を実行します。また、 '.Where'、' .Select( 'または他の' IQueryable ')の操作は、サーバー上で発生するSQLクエリの一部でもありません。 –