gpt4 book ai didi

c# - 我怎样才能做一个 Func>> 动态?

转载 作者:太空狗 更新时间:2023-10-29 23:39:26 26 4
gpt4 key购买 nike

我正在研究一个 .Find(objects[] keys) 方法,该方法动态创建一个 lambda 函数来查询数据库。

基本上我想要的是:

var mykeys = new Guid("37ec1659-b35e-46c9-a7fc-e9802644ca1a");
IQueryable<T> database ;
Func<object[],Expression<Func<T,bool>>> objectFinder = CreateKeyExpression(typeof(T));
var foundObject = database.FirstOrDefault(objectFinder(mykeys));

private LambdaExpression CreateKeyExpression(Type C1Type)
{

ParameterExpression instanceParameter = Expression.Parameter(C1Type);
ParameterExpression keyParameters = Expression.Parameter(typeof(object[]));

PropertyInfo[] objectKeys = C1Type.GetKeyProperties().ToArray();
var expr = Expression.Equal( Expression.TypeAs( Expression.Property(instanceParameter,objectKeys[0]),typeof(object)),
Expression.ArrayIndex(keyParameters,Expression.Constant(0)));


for (int i = 1; i < objectKeys.Length; i++)
{
expr = Expression.AndAlso(expr, Expression.Equal(
Expression.Property(instanceParameter,objectKeys[i]),
Expression.ArrayIndex(keyParameters,Expression.Constant(i))
));

}

var lmp= Expression.Lambda(expr, instanceParameter);

return Expression.Lambda(lmp, keyParameters);
}

关于如何实现此目标的任何想法?以上给了我一个 Func<object[],Func<T,bool>> ,这使得 IQueryable 成为 IEnumerable,这意味着它不会在数据库端执行此操作。

最佳答案

您需要使用Expression.Constant 方法而不是Expression.ArrayIndex,因为您将无法将键值传递给表达式数组使用 FirstOrDefault 方法。

private static LambdaExpression CreateKeyExpression(Type C1Type, object[] parameters)
{
var instanceParameter = Expression.Parameter(C1Type);
PropertyInfo[] objectKeys = C1Type.GetKeyProperties().ToArray();

var expr = Expression.Equal(Expression.Property(instanceParameter, objectKeys[0]),
Expression.Constant(parameters[0], objectKeys[0].PropertyType));


for (int i = 1; i < objectKeys.Length; i++)
{
expr = Expression.AndAlso(expr, Expression.Equal(
Expression.Property(instanceParameter, objectKeys[i]),
Expression.Constant(parameters[i], objectKeys[i].PropertyType)));
}
return Expression.Lambda(expr, instanceParameter);
}

var parameters = new object[] { Guid.NewGuid(), Guid.NewGuid() };
var lambdaExpression = CreateKeyExpression(typeof(TestClass), parameters);
var testClasses = new List<TestClass>() { new TestClass { Id = (Guid)parameters[0], Id1 = (Guid)parameters[1] } };
var testClass = testClasses.AsQueryable().FirstOrDefault((Expression<Func<TestClass, bool>>)lambdaExpression);

关于c# - 我怎样才能做一个 Func<object[],Expression<Func<T,bool>>> 动态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com