Generic Find() with Includes Entity Framework
c#, entity-framework, generics
Solution
You cannot use `Find` directly - `Find` doesn't work with includes. You must use `SingleOrDefault`.
First you need to define interface for your entities to expose their key.
public interface IEntityWithId
{
public int Id { get; set; }
}
Next you can write simple method with constrain to get access to the key:
public E FindByIdWithIncludes<E>(int id, string[] includes)
where E : class, IEntityWithId
{
IQueryable<E> entityQuery = DataContext.Set<E>();
foreach (var include in includes)
{
entityQuery = entityQuery.Include(include);
}
return entityQuery.SingleOrDefault(e => e.Id == id);
}
Btw. you can use strongly typed includes - here is an example.
Problem
I currently have a complete generic repository but I'm missing one feature and that is to use Include() and `Find()` together. So now I have: ``` public E FindById<E>(int id) where E : class { return DataContext.Set<E>().Find(id); } ``` called using ``` var person = PersonRepo.FindById<Person>(personId); ``` I would like to have something similar to: ``` var person = PersonRepo.FindByIdWithIncludes<Person>(personId,new[]{"State.Address"}); ``` So, something along this lines (this is only a test): ``` public E FindByIdWithIncludes<E>(int id, string[] includes) where E : class { var entitySet = DataContext.Set<E>(); DbQuery<E> entityQuery; foreach (var include in includes) { entityQuery = entitySet.Include(include); } return entityQuery.Find(id); //this is were it breaks } ``` Is it possible?