【问题标题】:Adding methods to LINQ queries向 LINQ 查询添加方法
【发布时间】:2013-12-08 03:32:57
【问题描述】:

我正在尝试像这样创建一个简单的 LINQ 查询:

var query = from o in entities.Orders   
        select new Order
        {
            Firstname = o.FirstName,
            Lastname = GetName()
        };    

这里我想从数据库中获取名字,并且我想从另一个来源提供姓氏。当我运行它时,我得到一个异常:“LINQ to Entities 无法识别方法 'System.String GetName()' 方法,并且该方法无法转换为存储表达式。”

如何将自己的方法添加到 LINQ 查询中?

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    您不能,您必须通过其他方式解决您遇到的问题,通常通过拆分为两个投影,一个可能被转换为 SQL 并在数据库服务器上运行,一个在客户端上运行。

    var query =
        from o in
            (from o in entities.Orders
             select new
             {
                 o.FirstName,
             }).AsEnumerable()
        select new Order
        {
            Firstname = o.FirstName,
            Lastname = GetName()
        };    
    

    注意:结果不是IQueryable,您可能添加的任何过滤或排序也将在客户端上运行。

    【讨论】:

    • 谢谢hvd。有没有办法避免重写其他参数?我有很多参数以及名字​​。我不想在查询和枚举中重复它们。
    • 您可能可以执行var orders = (from o in entities.Orders select new Order { FirstName = o.FirstName }).AsEnumerable().Select(o => { o.Lastname = GetName(); return o; }) 之类的操作,但这是否有效取决于您的类的行为方式。据我所知,第二个 Select 不能用 LINQ 语法编写。
    【解决方案2】:

    您不能将自己的方法添加到 Linq 到实体查询,因为该查询已转换为 SQL 并在 SQL 服务器上执行。唯一允许的自定义方法必须是映射的 SQL 函数或模型定义的函数(在 EDMX 中定义的 ESQL 函数)。

    如果您想在 Linq 查询中执行 .NET 方法,您必须首先从 Linq-to-entities 查询中具体化结果(执行 SQL),然后继续在您的应用程序中执行 Linq-to-objects 查询。

    【讨论】:

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