簡體   English   中英

EF Core 2.0 包括具有動態查詢的嵌套實體

[英]EF Core 2.0 include nested entities with dynamic query

我正在使用System.Linq.Dynamic.Core; 以及以下擴展方法,用於按名稱動態訪問 DbSet 並從字符串生成查詢。

這是擴展方法:

namespace Microsoft.EntityFrameworkCore
{
    public static partial class CustomExtensions
    {
        public static IQueryable Query(this DbContext context, string entityName) =>
            context.Query(context.Model.FindEntityType(entityName).ClrType);

        public static IQueryable Query(this DbContext context, Type entityType) =>
            (IQueryable)((IDbSetCache)context).GetOrAddSet(context.GetDependencies().SetSource, entityType);
    }
}

這是我訪問 DbSet 的方式:

IQueryable<T> dbSet = (IQueryable<T>)_db.Query(entityName);

這工作正常,我可以構建一個查詢,然后創建一個列表,但沒有任何嵌套實體加載。 似乎IQueryable沒有Include()的定義。 如果我以正常方式直接訪問數據庫上下文但不使用此動態方法,我可以看到包含方法。

如何使用動態方法包含嵌套實體?

首先您使用的是IDbSetCache GetOrAddSet

 public interface IDbSetCache

// // 摘要: // 此 API 支持 Entity Framework Core 基礎結構,不打算直接從您的代碼中使用 //。 此 API 將來可能會更改或刪除

IncludeMicrosoft.EntityFrameworkCoreEntityFrameworkQueryableExtensions中的IQueryable<TEntity>方法,不適用於IQueryable 您的函數返回IQueryable

我建議您創建如下擴展方法,

        public static IQueryable<T> MyQuery<T>(this DbContext context)
            where T : class
        {
            return context.Set<T>().AsQueryable();
        }

你可以消費,

  var result = _dbContext.MyQuery<Employee>().Include("Department");

對於動態包含,

    /// <summary>
    /// Query with dynamic Include
    /// </summary>
    /// <typeparam name="T">Entity</typeparam>
    /// <param name="context">dbContext</param>
    /// <param name="includeProperties">includeProperties with ; delimiters</param>
    /// <returns>Constructed query with include properties</returns>
    public static IQueryable<T> MyQueryWithDynamicInclude<T>(this DbContext context, string includeProperties)
       where T : class
    {            
        string[] includes = includeProperties.Split(';');
        var query = context.Set<T>().AsQueryable();

        foreach (string include in includes)
            query = query.Include(include);

        return query;
    }

我有一個解決這個問題的代碼。 我使用表達式樹。

我的實體模型如下所示:

public class PortfolioTechnology
{
    public int PortfolioId { get; set; }
    public Portfolio Portfolio { get; set; }

    public int TechnologyId { get; set; }
    public Technology Technology { get; set; }
}

我的主要代碼如下:

public SharpListResponse<PortfolioTechnology> GetAll(
    Expression<Func<PortfolioTechnology, bool>> predicate,
    params Expression<Func<PortfolioTechnology,object>>[] includes)
{
    var query = _dbContext.PortfolioTechnology.AsQueryable();

    foreach (var include in includes)
    {
        var memberExpression = include.Body as MemberExpression;

        if (memberExpression != null)
            query = query.Include(memberExpression.Member.Name);
    }

    var result = query.Where(predicate).ToList();

    return new SharpListResponse<PortfolioTechnology>(result);
}

並使用此方法如下:

var list = _unitOfWork.PortfolioTechnologyRepository.GetAll(x => x.PortfolioId == id, 
                                                            y => y.Technology);

如果您想包含多個實體,例如包含投資組合和技術實體,您的代碼如下:

 var list = _unitOfWork.PortfolioTechnologyRepository.GetAll(x => x.PortfolioId == id, 
                                                             y => y.Technology,
                                                             x => x.Portfolio);

注意: SharpListResponse是包裝類。 代碼在沒有它的情況下工作

SharpListResponse 的更多詳細信息: https ://www.nuget.org/packages/SharpRequestResponseWrapper/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM