以下代码在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)
答案 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,我目前不感兴趣!