Created
November 11, 2021 18:52
-
-
Save pawelel/50487ec90ed284b364ece896034eda4e to your computer and use it in GitHub Desktop.
How to write Repository method for .ThenInclude in EF Core https://stackoverflow.com/questions/46374252/how-to-write-repository-method-for-theninclude-in-ef-core-2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <summary> | |
/// Gets the first or default entity based on a predicate, orderby delegate and include delegate. This method default no-tracking query. | |
/// </summary> | |
/// <param name="selector">The selector for projection.</param> | |
/// <param name="predicate">A function to test each element for a condition.</param> | |
/// <param name="orderBy">A function to order elements.</param> | |
/// <param name="include">A function to include navigation properties</param> | |
/// <param name="disableTracking"><c>True</c> to disable changing tracking; otherwise, <c>false</c>. Default to <c>true</c>.</param> | |
/// <returns>An <see cref="IPagedList{TEntity}"/> that contains elements that satisfy the condition specified by <paramref name="predicate"/>.</returns> | |
/// <remarks>This method default no-tracking query.</remarks> | |
public TResult GetFirstOrDefault<TResult>(Expression<Func<TEntity, TResult>> selector, | |
Expression<Func<TEntity, bool>> predicate = null, | |
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, | |
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null, | |
bool disableTracking = true) | |
{ | |
IQueryable<TEntity> query = _dbSet; | |
if (disableTracking) | |
{ | |
query = query.AsNoTracking(); | |
} | |
if (include != null) | |
{ | |
query = include(query); | |
} | |
if (predicate != null) | |
{ | |
query = query.Where(predicate); | |
} | |
if (orderBy != null) | |
{ | |
return orderBy(query).Select(selector).FirstOrDefault(); | |
} | |
else | |
{ | |
return query.Select(selector).FirstOrDefault(); | |
} | |
} | |
//usage | |
var affiliate = await affiliateRepository.GetFirstOrDefaultAsync( | |
predicate: b => b.Id == id, | |
include: source => source | |
.Include(a => a.Branches) | |
.ThenInclude(a => a.Emails) | |
.Include(a => a.Branches) | |
.ThenInclude(a => a.Phones)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment