【问题标题】:Dynamically created expression动态创建的表达式
【发布时间】:2020-04-29 22:54:51
【问题描述】:

我尝试为 Linq 查询动态创建一个表达式,但它只返回此消息:

{方法 = 内部错误评估表达式} 我使用 Vs 2019 和 .NET Core 3.1。 类客户{ 公共字符串名称 { 获取;放; } ... }

        var parameter = Expression.Parameter(typeof(Client), "x");
        var member = Expression.Property(parameter, "Name");
        var constant = Expression.Constant("X Y");
        var exp = Expression.Equal(member, constant);
        var func = Expression.Lambda(exp, parameter).Compile();

请问我哪里出错了?

更新

namespace Domain
{
public class Client
{
    public string Name { get; set; }

    public string UserName { get; set; }

    public string Department { get; set; }

    public string CompanyPhoneNumber { get; set; }

    public string PrivateMobileNumber { get; set; }

    public string ComputerName { get; set; }

    public Guid InternetProviderId { get; set; }

    public virtual InternetProvider InternetProvider { get; set; }

    public string OtherInternetProvider { get; set; }
}
}

【问题讨论】:

  • 错误一定在其他地方,我已经尝试过这段代码,它工作得很好。有什么东西可能导致 Client 类中的问题吗?你能给我们这个类的完整定义吗?您是否在调用 Compile 方法的同一行收到该错误?
  • 感谢您的回答。 Compile 方法导致问题,表达式“exp”似乎是正确的。
  • 很难说发生了什么,这里是你的代码的工作示例:dotnetfiddle.net/nmXbfa 基本上没有变化,它工作得很好。

标签: c# asp.net-core expression


【解决方案1】:

Expression.Lambda 方法有一个通用版本,允许指定委托类型,最后一行可以修改为:

var func = Expression.Lambda<Func<Client, bool>>(exp, parameter).Compile();

使用示例:

var list = new List<Client>
{
    new Client() { Name = "X Y"}
};

var l2 = list.Where(func).ToList();

工作示例:here

【讨论】:

  • 谢谢你的回答,但结果是一样的。
  • 在答案中添加了一个工作示例,请尝试一下。
  • 但我想在 Blazor 应用程序中使用它。
  • 谢谢,它有效,但我不知道为什么。也许你是一个电脑巫师。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多