【问题标题】:LINQ to Entities does not recognize the method get_Item(Int32) [duplicate]LINQ to Entities 无法识别方法 get_Item(Int32) [重复]
【发布时间】:2018-01-30 19:40:49
【问题描述】:

我希望有人可以帮助我。我有一个相对简单的程序,可以从实体查询数据并将查询绑定到dataGridView1,但我遇到了以下错误,我试图在 30 多分钟内解决但没有进展。

System.NotSupportedException: 'LINQ to Entities 无法识别方法'System.Windows.Forms.DataGridViewCell get_Item(Int32)' 方法,并且此方法无法转换为存储表达式。'

using (var context = new myContext())
{
    var query = context.mySoftWare
        .Where(s => s.Software.Contains(dataGridView2.SelectedRows[0].Cells[0].Value.ToString()))
        .Select(r => new {r.SID, r.Software,r.Vendor,r.Version });

    dataGridView1.DataSource = query.ToList();
}

【问题讨论】:

  • 您不能在实体查询中混合使用数据库数据库级代码和“应用程序”代码。它不知道如何将应用程序代码转换为数据库可以理解的内容。
  • 您应该在查询之前将dataGridView2.SelectedRows[0].Cells[0].Value.ToString() 拉出到一个简单的变量中,并在查询中使用该变量。
  • 这已经被问了数百万次了。您只需搜索“LINQ to Entities 无法识别该方法”。

标签: c# entity-framework


【解决方案1】:

您在Where 中编写的代码被翻译 为 SQL。这样做的引擎不知道如何将dataGridView2.SelectedRows[0].Cells[0].Value.ToString() 翻译成 SQL。

解决此问题的简单方法是将该值设为自己的变量

var value = dataGridView2.SelectedRows[0].Cells[0].Value.ToString();

var query = context.mySoftWare
    .Where(s => s.Software.Contains(value))
    .Select(r => new { r.SID, r.Software, r.Vendor, r.Version });

dataGridView1.DataSource = query.ToList();

现在我们只希望sql引擎知道如何翻译“包含”。

【讨论】:

  • 有效!我希望错误能告诉我混合代码而不是一个非常难以理解的错误是愚蠢的 - 谢谢!!!!
  • 可能Contains 会很好,因为它不在s 上的属性,它来自Software 上的Expression,这是(至少看起来像) 一个 DbSet。意味着它是一个导航属性,所以它应该是IEnumerable<>
  • @UlinkSecret "[...]这个方法不能被翻译成存储表达式。"如果您考虑一下,这对我来说似乎是一个相当有用的错误。
  • 实际上,我进行了搜索,但找不到。当我看到答案时,他们指的是创建一个新列表 Int 因为问题是由于 SIDInt 而不是 String 。我应该更接近错误指示器,但我很沮丧
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 2020-07-23
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多