Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用接受linq表达式参数的方法_C#_Linq_Reflection_Dependency Injection_Entity Framework 6 - Fatal编程技术网

C# 如何调用接受linq表达式参数的方法

C# 如何调用接受linq表达式参数的方法,c#,linq,reflection,dependency-injection,entity-framework-6,C#,Linq,Reflection,Dependency Injection,Entity Framework 6,您好,这是我的方法,它作为通用实体框架存储库类的一部分存在 public IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties) { List<T> list; IQueryable<T> dbQuery = Context.Set<T>();

您好,这是我的方法,它作为通用实体框架存储库类的一部分存在

public IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties)
        {
            List<T> list;

            IQueryable<T> dbQuery = Context.Set<T>();

            //Apply eager loading
            foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                dbQuery = dbQuery.Include<T, object>(navigationProperty);

            list = dbQuery
            .AsNoTracking()
            .ToList<T>();
            return list;
        }
public IList GetAll(参数表达式[]导航属性)
{
名单;
IQueryable dbQuery=Context.Set();
//应用即时加载
foreach(navigationProperties中的表达式navigationProperty)
dbQuery=dbQuery.Include(navigationProperty);
list=dbQuery
.AsNoTracking()
.ToList();
退货清单;
}
我需要通过反射调用这个方法,这就是我到目前为止所做的

using (var ctx = (DbContext)Activator.CreateInstance(dbContextType))
            {
                ctx.Configuration.LazyLoadingEnabled = false;

                var curEntityPI = ctx.GetType().GetProperties().Where(pr => pr.Name == "Worker").First();
                var curEntityType = curEntityPI.PropertyType.GetGenericArguments().First();
                var set = ctx.Set(curEntityType);
                Type generic = typeof(DataAccess.Repository.EF.dEfDataRepository<,>);
                Type[] typeArgs = {curEntityType, dbContextType};
                Type constructed = generic.MakeGenericType(typeArgs);
                MethodInfo methodInfo = constructed.GetMethod("GetAll");

                object repositoryInstance = Activator.CreateInstance(constructed, new object[] { ctx });
                var result = methodInfo.Invoke(repositoryInstance,new object[] { });
            }
使用(var ctx=(DbContext)Activator.CreateInstance(dbContextType))
{
ctx.Configuration.LazyLoadingEnabled=false;
var curEntityPI=ctx.GetType().GetProperties().Where(pr=>pr.Name==“Worker”).First();
var curEntityType=curEntityPI.PropertyType.GetGenericArguments().First();
var set=ctx.set(curEntityType);
Type generic=typeof(DataAccess.Repository.EF.dEfDataRepository);
Type[]typeArgs={curEntityType,dbContextType};
构造的类型=generic.MakeGenericType(typeArgs);
MethodInfo MethodInfo=constructed.GetMethod(“GetAll”);
object repositoryInstance=Activator.CreateInstance(已构造,新对象[]{ctx});
var result=methodInfo.Invoke(repositoryInstance,新对象[]{});
}
我知道我需要更改methodInfo.Invoke中的参数数组,但出于测试目的,我会说它只是一个空的linq表达式,或者在静态调用时与此等价

WorkerRepository workerRepositoryInstance = new
WorkerRepository<Worker,MyDbContext>(ctx);
List<Worker> workers = workerRepositoryInstance.GetAll().ToList();
WorkerRepository workerRepositoryInstance=new
工作场所(ctx);
List workers=workerRepositoryInstance.GetAll().ToList();
如何在methodInfo.Invoke()中提供正确的参数

我这样做是因为我需要处理dbcontext和外部dll中的实体,并且不能在我的应用程序项目中添加对此的引用。我的应用程序需要能够引用“附属”程序集,以便应用程序的不同部署可以访问数据提供程序dll的不同版本


非常感谢您的帮助。

如果我理解正确,您需要动态创建
表达式的空数组

您可以使用以下方法:

var navigationPropertyType = typeof(Expression<>).MakeGenericType(
    typeof(Func<,>).MakeGenericType(curEntityType, typeof(object)));

var navigationProperties = Array.CreateInstance(navigationPropertyType, 0);

var result = methodInfo.Invoke(repositoryInstance, new object[] { navigationProperties });
var navigationPropertyType=typeof(表达式)。MakeGenericType(
typeof(Func).MakeGenericType(curEntityType,typeof(object));
var navigationProperties=Array.CreateInstance(navigationPropertyType,0);
var result=methodInfo.Invoke(repositoryInstance,新对象[]{navigationProperties});

使用
表达式。*()
方法构建表达式树。实际问题是什么?为了避免在您目前所做的工作中出现异常?现在是的,新对象[]{}正在创建异常,因此我只想通过反射获得与上一个块中等效的静态代码一样的结果(假设我键入的代码正确,实际上我在其他地方通过DI实例化了我的存储库略有不同)即得到一些结果。除此之外,我还想了解如何使用示例表达式调用此方法,因为我没有对反射做过很多工作,也没有结合linq和泛型。为此,我将无法直接访问程序集实体名称中的任何类型,即“Worker”,非常感谢Ivan解决了我眼前的问题。对于创建linq表达式,您有什么好的参考资料吗?或者知道我能在自己周围搜索到的最好的术语。我想是Lambda,linq func,是吗?无论如何,非常感谢。
Expression.Parameter
Expression.PropertyOrField
Expression.Lambda
应该足以创建
Include
表达式。作为参考,我不知道-我在这方面有很多SO帖子,但它们都来自自我学习和实验。