Entity Framework Repository Pattern why not return Iqueryable?

前端 未结 2 601
挽巷
挽巷 2020-12-03 15:31

There are several good blogs about how to implement the repository pattern together with the unit-of-work pattern using generic classes.

Implementing a Data Access L

相关标签:
2条回答
  • 2020-12-03 15:47

    One of the reasons we use the repository pattern is to encapsulate fat queries. These queries make it hard to read, understand and test actions in ASP.NET MVC controllers. Also, as your application grows, the chances of you repeating a fat query in multiple places increases. With the repository pattern, we encapsulate these queries inside repository classes. The result is slimmer, cleaner, more maintainable and easier-to-test actions. Consider this example:

    var orders = context.Orders
        .Include(o => o.Details)
            .ThenInclude(d => d.Product)
        .Where(o => o.CustomerId == 1234);
    

    Here we are directly using a DbContext without the repository pattern. When your repository methods return IQueryable, someone else is going to get that IQueryable and compose a query on top of it. Here’s the result:

    var orders = repository.GetOrders()
        .Include(o => o.Details)
            .ThenInclude(d => d.Product)
        .Where(o => o.CustomerId == 1234);
    

    Can you see the difference between these two code snippets? The only difference is in the first line. In the first example, we use context.Orders, in the second we use repository.GetOrders(). So, what problem is this repository solving? Nothing!

    Your repositories should return domain objects. So, the GetOrders() method should return an IEnumerable. With this, the second example can be re-written as:

    var orders = repository.GetOrders(1234);
    

    See the difference? Retrieved from Mr. Hamedani blog

    0 讨论(0)
  • 2020-12-03 16:12

    This isn't recommended because it would invalidates the repository pattern. The purpose of this pattern is to keep your DAL implementation separate from your other projects by means of abstraction.

    In essence returning an IQueryable would return the TSQL statement and NOT the results meaning any projects that reference your DAL would require additional references to EF to be able to perform the execution of the query. This 'data leak' would make your projects more tightly-knit and thus would contradict the separation of concern principle.

    You can read more about the repository pattern and its benefits here: http://www.codeproject.com/Articles/526874/Repositorypluspattern-cplusdoneplusright

    0 讨论(0)
提交回复
热议问题