【问题标题】:Cannot Cast String to GUID in LINQ to Entities无法在 LINQ to Entities 中将字符串转换为 GUID
【发布时间】:2017-01-30 18:01:37
【问题描述】:

以下代码在 LinqPad 中运行良好:

(from u in AspNetUsers
     let userOrders = (from uo in UserOrders where uo.UserId == new Guid(u.Id) select uo)
     select u)

但是,当我尝试从我的 MVC 应用程序中执行完全相同的代码时,它给了我以下错误:

var users = (from u in ctx.Users
             let userOrders = (from uo in ctx.UserOrders where uo.UserId == new Guid(u.Id) select uo)
             select u);

LINQ to Entities 仅支持无参数构造函数和初始化程序。

我不记得以前在 Linq to Entities 中将字符串转换为 GUID 时遇到过任何问题。我错过了一些参考吗?

我已经包含了所有我能想到的参考资料:

using System.Linq;
using System.Data.Entity;

为什么它在 LinqPad 中有效,而在 MVC 中无效?

编辑:奇怪的是,这似乎有效:

let userOrders = (from uo in ctx.UserOrders where uo.UserId.ToString() == u.Id select uo)

【问题讨论】:

  • new Guid(u.Id)
  • 此外,这些似乎是自定义表,如果是这样,您可能想要某种 FK,在这种情况下,id 无论如何都应该是相同的类型,最好的选择是修复存储模式,以便类型匹配。
  • 架构本身不是“自定义”的,它来自 MVC 的默认 AspNetUsers 构造,其中用户 ID(GUID)表示为字符串。我不想改变它,只想简单地将它与另一个表匹配。应该有一些简单的函数可以将字符串转换为uniqueindentifier。有什么想法吗?
  • 您可以扩展架构并在其中一个值为转换后的 id 的表上添加计算列。因此,在 aspnetusers 上,您可以拥有 UsirIdAsGuid(或类似的东西),这只不过是您的 EF 模型也知道的计算列。然后你加入那个。
  • Guid.Parse Guid.Parse没有翻译。另见CLR Method to Canonical Function Mapping

标签: c# asp.net-mvc entity-framework linq


【解决方案1】:

当您在上下文中时,对象尚未实现。为什么你不只是使用自动内置的导航属性?

当您在数据库或数据结构中有外键时。这会在实体框架中创建一个“导航”属性。因此,您可以更快地获得子对象。很多时候,它们会根据您的延迟加载与急切加载的 EF 选项自动给出。 'include' 强制获得导航。因此,如果只想从我的人员表中获取订单(单独的表),我会询问人员,然后将其作为子表。我也知道实体框架中存在“已实现”的概念,直到您可以合法地放置一些“ToList”或“ToString”,如果您在意识到它们将无法工作之前尝试将它们连接到引擎盖下太多。

static void Main(string[] args)
{
      using (var context = new TesterEntities())
      {
        var peopleOrders = context.tePerson.Include("teOrder").First(p => p.PersonId == 1).teOrder.ToList();
        peopleOrders.ForEach(x => Console.WriteLine($"{x.OrderId} {x.Description}"));
      }
}

【讨论】:

    【解决方案2】:

    最终,我决定采用更简单的方法来投射我的 GUID .ToString(),如下所示:

    let userOrders = (from uo in ctx.UserOrders where uo.UserId.ToString() == u.Id select uo)
    

    原因是,AspNetUsers 的默认实现将列定义为 varchar,而不是 uniqueidentifier,因此为了更改它,我可能必须执行类似 How to make EF-Core use a Guid instead of String for its ID/Primary key 的操作,我目前对此不感兴趣!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多