How to pass lambda 'include' with multiple levels in Entity Framework Core?

前端 未结 3 495
终归单人心
终归单人心 2020-12-06 08:25

I have a repository that gets a lambda expression for \'include\'.

public TEntity FirstOrDefault(Expression> predicate, para         


        
3条回答
  •  心在旅途
    2020-12-06 09:10

        public TEntity FirstOrDefault(Expression> predicate, params Expression>[] includePaths)
            {
    DbSet = Context.Set();
        var query = includePaths.Aggregate(DbSet, (current, item) => EvaluateInclude(current, item));
                 return query.Where(predicate).FirstOrDefault();
            }
    
        private IQueryable EvaluateInclude(IQueryable current, Expression> item)
                    {
                        if (item.Body is MethodCallExpression)
                        {
                            var arguments = ((MethodCallExpression)item.Body).Arguments;
                            if (arguments.Count > 1)
                            {
                                var navigationPath = string.Empty;
                                for (var i = 0; i < arguments.Count; i++)
                                {
                                    var arg = arguments[i];
                                    var path = arg.ToString().Substring(arg.ToString().IndexOf('.') + 1);
    
                                    navigationPath += (i > 0 ? "." : string.Empty) + path;
                                }
                                return current.Include(navigationPath);
                            }
                        }
    
                        return current.Include(item);
                    }
    

提交回复
热议问题