【发布时间】: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.ParseGuid.Parse没有翻译。另见CLR Method to Canonical Function Mapping
标签: c# asp.net-mvc entity-framework linq