gpt4 book ai didi

c# - LINQ to Entities Select with LINQkit 中的调用表达式

转载 作者:行者123 更新时间:2023-11-30 14:32:51 24 4
gpt4 key购买 nike

这是我想做的:

class MyDbContext : DbContext 
{
private static Expression<Func<MyClass, int>> myExpression1 = x => /* something complicated ... */;
private static Expression<Func<Item, int>> myExpression2 = x => /* something else complicated ... */;

public object GetAllData()
{
return (
from o in MyClassDbSet.AsExpandable()
select new
{
data1 = myExpression1.Invoke(o), // problem 1
data2 = o.Items.Select(myExpression2.Compile()) // problem 2
}
);
}
}

更新:

myExpression 必须与我的查询分开,因为我想在多个 LINQ 查询中重用它。

更新 2:

myExpression 分成 myExpression1myExpression2 以明确我想单独重用它们的事实。

更新 3:

在示例中添加了 LINQkit。

问题 1 抛出:无法将“System.Linq.Expressions.FieldExpression”类型的对象转换为类型“System.Linq.Expressions.LambdaExpression”。

问题 2 抛出:内部 .NET Framework 数据提供程序错误 1025。

最佳答案

关于使用 LinqKit 时的第一个问题,您需要在 .Invoke() 之前将表达式分配给局部变量。更完整的解释可以在 this question 上找到.

第二个问题是 select 方法接受一个类型的对象:

Expression<Func<TSource, TResult>>

这意味着您必须提供一个接受 TSource 对象作为参数并返回 TResult 对象的 lambda 表达式。

您的 TSource 对象是 Item,即您从中进行查询的表。你的 TResult 在你的例子中是一个 int,这是你在表达式上定义的。

因此,您必须在传递 Item 对象作为参数的第二个表达式上调用 .Invoke(),就像传递 MyClassDbSet 对象“o”一样。实际上,这两个 select 语句只是语法上的不同,它们本质上做的是同一件事。

并且您不应该在表达式上调用 .Compile(),这会产生:

Func<TSource, TResult>

它是表达式树编译版本的委托(delegate),不能转换为 SQL 表达式。可以找到更多信息here .

它应该适用于以下更改:

class MyDbContext : DbContext 
{
private static Expression<Func<MyClass, int>> myExpression1 = x => /* something complicated ... */;
private static Expression<Func<Item, int>> myExpression2 = x => /* something else complicated ... */;

public object GetAllData()
{
Expression<Func<MyClass, int>> myLocalExpression1 = myExpression1;
Expression<Func<MyClass, int>> myLocalExpression2 = myExpression2;

return (
from o in MyClassDbSet.AsExpandable()
select new
{
data1 = myLocalExpression1.Invoke(o),
data2 = o.Items.Select(item => myLocalExpression1.Invoke(item))
}
);
}
}

关于c# - LINQ to Entities Select with LINQkit 中的调用表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17684379/

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