【问题标题】:Extension method on Enum causes Linq Query to FailEnum 上的扩展方法导致 Linq 查询失败
【发布时间】:2013-12-05 05:05:10
【问题描述】:

我在一个名为GetName 的枚举上有一个扩展方法,它返回一个字符串。我在 linq to entity 框架中使用它来选择具有特定产品名称的行。然而,当代码被执行时,它会抛出一个NotSupportedException

LINQ to Entities 无法识别 System.String 方法 GetName(Tool.ViewModels.Product) 方法,该方法不能 翻译成商店表达式。

这是我正在执行的代码:

try
{
    //Linq to Entity Framework
    var contextRow = Contexts.Data.Source.SingleOrDefault(p => p.Product == Product.ProductOne.GetName());
}
catch (Exception e)
{
    throw e;
}

Linq 在其评估中不识别扩展方法吗?还是有更多的事情发生?

【问题讨论】:

  • 这种问题在开始使用Entity Framework的时候是非常有名的:)
  • 出行很容易,我只是好奇为什么会这样。
  • “这个方法不能翻译成store表达式”,意思是:没有办法把这个翻译成SQL。
  • 原因与 EF 的工作方式有关,所有查询都将被翻译成底层提供程序语言,可能是 SQL Server。由于不完全支持多种表达式的翻译,在这种情况下会抛出异常。
  • @KingKing,如果它使用 SQL 作为提供程序语言,我会理解,但我相当肯定它不是。数据来自sql server中的一个视图,但是我在应用程序启动时枚举它[只有几行]。

标签: c# linq entity-framework


【解决方案1】:

在底层,实体框架将您键入的代码映射到 SQL 查询中。当它看到对GetName 的调用时,它会看到对用户定义函数的调用。它没有能力将本质上相当于原始 IL 的内容翻译成格式良好的 SQL 查询。这就是为什么你会得到那个异常

【讨论】:

  • 这里的问题是,我正在缓存我的数据。例子:stackoverflow.com/questions/6421127/… 所以应该不会去sql吧?
  • 我刚刚意识到执行缓存的代码不正确。这使 linq 转到 sql,这导致了我的问题。谢谢!
【解决方案2】:

使用 LINQ 时,你必须定义一个上下文,并在该上下文中对数据库执行操作,例如你要运行的代码,你可以这样

使用 (ModelLinq _context = new ModelLinq()){

var rows= _context.anyTable.Where(p=> p.anyColumn == value);

}

而Entity Framework是你数据库的映射,供你使用lenguale c#执行SQL查询

问候!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多