Suppose that I have an object used by my code, say Person:public class Person {    public string Name {get;set;}    public Address Address {get; set;}}public class Address {    public string AddressLine1 {get;set;}    public string AddressLine2 {get;set;}    public string City {get;set;}    public string State {get;set;}    public string ZipCode {get;set;}}Simple so far. Suppose that I persist this object in SQL Server in the following way:public class PersonEntity {    public string Name {get;set;}    public string AddressLine1 {get;set;}    public string AddressLine2 {get;set;}    public string City {get;set;}    public string State {get;set;}    public string ZipCode {get;set;}}Obviously, it is good to abstract how an object is persisted in the DB from the logic. This way, I can replace the way my tables look, or my technology without changing the logic of my solution.The problem arise if I want to use abstract repository:public interface IRepository<TEntity>{    IEnumerable<TEntity> Get(Func<TEntity, bool> pre);    ...}public class PersonRepository<PersonEntity>{    ...}Now, if my business logic code wants to access the repository, they have to know  about PersonEntity in order to use the generic Get function. Ideally, the business logic needs to send a request like Get(person => person.Address.State == NY); instead.Is there away, elegant and simple, to achieve that level of abstraction?
Abstracting Repository
c#;.net;entity framework;repository