8

重複の可能性:
IQueryable<T> を返すか、IQueryable<T> を返さないか

次のように実装されたLINQ to SQLリポジトリがあります。GetAll メソッドは、IQueryable ではなくジェネリック リストを返しています。ただし、ほとんどの例とチュートリアルでは、pit が IQueryable を返すことが示されています。IQueryable を返す利点は何ですか?

using System.Linq;
namespace RepositoryLayer
{
public interface IRepository<T> where T : class
{
    //System.Linq.IQueryable<T> GetAll();
    System.Collections.Generic.List<T> GetAll();
}

public class Repository<T> : IRepository<T> where T : class
{
    public System.Data.Linq.DataContext Context
    {
        get;
        set;
    }

    //public virtual System.Linq.IQueryable<T> GetAll()
    //{
    //    //GetAll is returning generic Queryable<T>. 
    //    System.Linq.IQueryable<T> allItems = Context.GetTable<T>();
    //    return allItems;
    //}

    public virtual System.Collections.Generic.List<T> GetAll()
    {

        System.Linq.IQueryable<T> allItems = Context.GetTable<T>();
        return allItems.ToList();
    }


  }
}

ビジネス層

namespace BusinessLayerProject
{
public class AccountBusiness
{
    //IRepository<T>
    RepositoryLayer.IRepository<RepositoryLayer.Account> accountRepository;
    public AccountBusiness(RepositoryLayer.IRepository<RepositoryLayer.Account> repo)
    {
        accountRepository = repo;
    }

    //public List<RepositoryLayer.Account> GetAllAccounts()
    //{

    //    //LibraryManagementClassesDataContext context = new LibraryManagementClassesDataContext();
    //    //List<RepositoryLayer.Account> accontList = context.Accounts.ToList();

    //    System.Linq.IQueryable<RepositoryLayer.Account> acc = accountRepository.GetAll();
    //    return acc.ToList();
    //}

    public List<RepositoryLayer.Account> GetAllAccounts()
    {
        List<RepositoryLayer.Account> acc = accountRepository.GetAll();
        return acc;
    }


 }
}

読む

  1. オブジェクトごとに汎用リポジトリと特定のリポジトリを作成する利点は?
4

3 に答える 3

6

IQueryableLINQを使用すると、さまざまな SQL クエリを作成して、追加の作業を DB に移動できます。例えば。次のようなものを試してGetAll().Where(condition)使用すると、ListすべてのアイテムがDBからクエリされ、アプリケーション側で条件がチェックされます。使用するIQueryableとDBに移動でき、そこから適切なアイテムが直接返されます。

于 2012-06-21T06:26:26.577 に答える
3

IQueryable伸びIEnumerableます。どちらも反復されるまでデータを投影/膨張させませんが、IListオブジェクトはすべてのデータをプルし、割り当てられたときに入力されます。

したがって、これは「遅延ロード」と「イーガーロード」の違いです。

于 2012-06-21T06:26:26.597 に答える
1

IList は - ああ - 賢くないからですか?

どうぞ:

IIF yo uexport IQueryable - Get メソッドでは、必要なメソッドはこれだけです。すべてのパラメーターは IQueryable に入り、SQL 層で遅延実行が終了するためです。

IList をエクスポートすると、GET ALL と THEN フィルターがメモリ内で実行されます。これは、LINQ の倒錯と同じくらいです。

ここでの本当の秘訣は、Get メソッドと .Where、OrderBy を makcal すると、データベースの sql ステートメントに入るということです。

于 2012-06-21T06:27:31.427 に答える