【问题标题】:LINQ to Entities does not recognize the method 'System.String get_Item(Int32)' methodLINQ to Entities 无法识别方法“System.String get_Item(Int32)”方法
【发布时间】:2019-12-28 01:28:24
【问题描述】:

我正在尝试为类列表分配一个值,但它似乎不喜欢我的 select 语句中的“外部”值。

C# .dll 文件中的代码(在 Visual Studio 中编译没有错误):

    Dictionary<int, string> My_dict1 = new Dictionary<int, string>();
    My_dict1.Add(0, "Welcome");

    var inv = traces.Select(x => new TraceLabelData
    {
        Name = My_dict1[0]
    }).ToList();

在 LINQPAD 中引用和运行时出错:

NotSupportedException LINQ to Entities 无法识别方法“System.String” get_Item(Int32)' 方法,并且这个方法不能翻译成store 表达。

如果我用纯字符串替换 My_dict[0] 它可以工作,如果我用一个纯字符串的变量替换它它可以工作。它不适用于字典,也不适用于返回字符串的函数。

【问题讨论】:

  • traces 到底是什么? IQueryable&lt;T&gt;(如果是,T 是什么)、DbSet&lt;T&gt; 等?
  • string first = My_dict1[0]; 然后在选择中使用它 Name = first
  • @Dai,T 是一个自定义类。我不知道如何描述它。无论如何,我从下面得到你的答案。
  • @CodingYoshi,我给出的示例已针对我的实际使用进行了简化,即我将以更高的二维 (?) 比例进行此操作。 IE。有名称、描述等,将需要 My_dict[0]、[1] 等。不过感谢您的回复。

标签: c# linq linqpad


【解决方案1】:

您传递给 LINQ-to-Entities 的表达式不会被计算。它们被解析,然后转换为 SQL 语句,然后由 SQL Server 评估。服务器不知道您的字典是什么,但它确实知道什么是纯字符串,这就是为什么它仅在您将代码更改为使用字符串时才起作用的原因。

这种情况下的解决方案是在您的 LINQ 语句之前从字典中检索您需要的值,然后直接使用检索到的值。

【讨论】:

    【解决方案2】:

    Linq-to-Entities 只能使用与您的后端数据库服务器兼容的 Linq 操作。显然,您的 My_dict1 对象在远程服务器中不存在(即您不能从原始 SQL 中使用它)。相反,使用AsEnumerable()ToList()ToListAsync() 将您的对象拉入内存让您的内存字典参与进来之前:

        Dictionary<int, string> dict = new Dictionary<int, string>();
        dict.Add( 0, "Welcome" );
    
        traces
            .AsEnumerable()
            .Select( t => new TraceLabelData() { Name = dict[0] } )
            .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2019-08-18
      • 1970-01-01
      相关资源
      最近更新 更多