c# - Repository and query objects pattern. How to implement complex queries -


i have read lot of posts of repository pattern there few practical problems doesn't seem solve or explain. understand 2 patterns:

the repository , query pattern complementary: query objects represents business logic (where clausules) , repository pattern has get(ipredicate) method takes query object , returns select result

the repository should not have business logic: business logic must go on query objects

currently have class wraps each logical object (wich single entity object) implements multiple "get" methods implement complex queries (joins, groupby, etc...), isn't pattern because classes tend grow lot because of boilerplate code similar queries , public methods dependent on context class used, thus, making classes unusable multiple projects depends on same database, wich primary goal project refactoring.

how queries more complex single select implemented 2 patterns without leaking business logic repository?

or if business logic doesn't fit repository nor query objects where logic fit?

thanks

there quite few implementations of repository patterns , unit of work flying around on internet. of them quite simple developer implements own each table himself manually, generic not advanced, , cool, generic , still offer ability decent where, projection , like.

an example of in opinion implementation can found here :

https://genericunitofworkandrepositories.codeplex.com/

it targetting mvc, shown interface. focussing on wpf applications needed tune bit. ideas of unit of work implementation pretty good.

there down side implementation. because relying on advanced linq , ef functionality 1 argue underlying access layer infecting repository layer , layers using repositories.

the point being when instance want move away ef, chances have change interface of repositories.

to show power of library code snippets prove :

_fotorepository = unitofwork.repositoryasync<foto>(); var fotos = await _fotorepository             .query(r => r.bestelbonid == bestelbonid || werkstukids.contains(r.werkstukmetbewerkingenid.value))             .selectasync()             .configureawait(false); 

or using projection:

irepository<relatie> relatierepository = unitofwork.repositoryasync<relatie>();         var relatiesoverviewsenumerable = relatierepository             .query()             .notracking()             .orderby(q => q.orderby(d => d.relatieid))             .select(b => new relatieoverview             {                 relatieid = b.relatieid,                 naam = b.naam,                 btw = b.btw,                 hoofdadres = b.adressen.firstordefault(a => a.adrestypeid == hoofdadrestype)             });         _relatieoverviews = new observablecollection<relatieoverview>(relatiesoverviewsenumerable); 

Comments

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

gradle error "Cannot convert the provided notation to a File or URI" -

python - NameError: name 'subprocess' is not defined -