1

Linq を使用する場合、SQL 全文検索機能を利用できないため、生の SQL クエリを記述できる DbSet で SqlQuery メソッドを使用したいと考えています。

次のコードを考えてみましょう:

IQueryable<Message> query = DBContext.Set<Message>();
PagedList<Message> messages = query.Where(x => x.Content.Contains("magic"))
    .OrderBy(x => x.CreatedDate)
    .ToPagedList<Message>(50, 2);

次の SqlQuery クエリを実行したい場合:

DBContext.Set<Message>().SqlQuery("SELECT * FROM Message WHERE CONTAINS("Content", 'magic')");

SqlQuery メソッドが返され、オブジェクトが返さIEnumerable<Message>れるようにしたいと考えています。PagedList<Message>それを達成するための最適な(良い)方法は何ですか?データベースで SQL クエリを実行し、メモリ内でフィルター処理しないようにしたいことに注意してください。

PagedList の実装

public class PagedList<T> : List<T>, IPagedList
{
    public PagedList()
    {
        this.TotalCount = 0;
        this.PageSize = 0;
        this.PageIndex = 0;
        this.TotalPages = 0;
        this.CurrentPage = 0;
    }

    public PagedList(IQueryable<T> source, int pageIndex, int pageSize)
    {
        this.TotalCount = source.Count();
        this.PageSize = pageSize;
        this.PageIndex = pageIndex;
        this.TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
        this.CurrentPage = Math.Max(1, pageIndex);
        this.AddRange(source.Skip((this.CurrentPage - 1)  * pageSize).Take(pageSize).ToList());
    }

    public PagedList(List<T> source, int index, int pageSize)
    {
        this.TotalCount = source.Count();
        this.PageSize = pageSize;
        this.PageIndex = index;
        this.TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
        this.CurrentPage = Math.Max(1, index);
        this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList());
    }

    public int TotalCount { get; set; }
    public int TotalPages { get; set; }
    public int PageSize { get; set; }
    public int PageIndex { get; set; }
    public int CurrentPage { get; set; }
}

ページ リストの拡張方法:

public static PagedList<T> ToPagedList<T>(this IQueryable<T> query, int pageIndex, int pageSize) where T : class
{
      return new PagedList<T>(query, pageIndex, pageSize);
}
4

1 に答える 1