LINQ to Entities中无法将字符串转换为GUID

时间:2017-01-30 18:01:37

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

以下代码在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到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)

2 个答案:

答案 0 :(得分:1)

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

在数据库或数据结构中有外键时。这创造了一个导航'实体框架中的属性。因此,您可以更快地获得子对象。很多时候,它们会自动给出,具体取决于您的懒惰与急切加载的EF选项。 '包括'强制获得导航。因此,如果只想要我的人员表中的订单(单独的表格),我会询问人,然后得到它的子表。我也知道有'实现了'与实体框架,直到你可以合法地放置东西' 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}"));
      }
}

答案 1 :(得分:1)

最终,我决定采用更简单的方法来投射我的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,我目前不感兴趣!