gpt4 book ai didi

c# - Linq to SQL DynamicInvoke(System.Object[])' 没有支持的 SQL 转换

转载 作者:太空狗 更新时间:2023-10-29 18:15:34 25 4
gpt4 key购买 nike

我有一个类(class),用户

Users 有一个 UserId 属性。

我有一个看起来像这样的方法:

static IQueryable<User> FilterById(this IQueryable<User> p, Func<int, bool> sel)
{
return p.Where(m => sel(m.UserId));
}

不可避免地,当我调用函数时:

var users = Users.FilterById(m => m > 10);

我得到以下异常:

Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL.

这个问题有什么解决办法吗?我可能需要深入 Expression.KillMeAndMyFamily() 的兔子洞多远?

澄清为什么我这样做:我正在使用 T4 模板自动生成一个简单的存储库和一个管道系统。在管道内,而不是写:

new UserPipe().Where(m => m.UserId > 10 && m.UserName.Contains("oo") && m.LastName == "Wee");

我想生成如下内容:

new UserPipe()
.UserId(m => m > 10)
.UserName(m => m.Contains("oo"))
.LastName("Wee");

最佳答案

我们以UserId 为例。你想写:

new UserPipe().UserId(uid => uid > 10);

并希望它与:

new UserPipe().Where(user => user.UserID > 10);

你需要做的是把第一个版本的表达式树翻译成第二个版本。


因此,首先更改 UserId 的签名以接受表达式树而不是已编译的 lambda:

public static IQueryable<User> UserId(
IQueryable<User> source, Expression<Func<int, bool>> predicate)

然后,编写一个将第一个表达式树转换为第二个版本的方法。让我们看一下两个表达式树:

输入:

        Lambda         uid          |       BinaryOp          >    /            \Parameter     Constant   uid           10

输出:

         Lambda          user            |        BinaryOp            >     /            \ Property         Constant  UserID             10     | Parameter   user

如您所见,您需要做的就是获取 lambda 的主体,递归地用参数上的属性 UserId 替换所有出现的参数 uid user 并使用转换后的主体和参数 user 创建一个新的 lambda 表达式。

您可以使用 ExpressionVisitor进行替换。

关于c# - Linq to SQL DynamicInvoke(System.Object[])' 没有支持的 SQL 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729820/

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