gpt4 book ai didi

.net - Entity Framework 中的可空实体投影

转载 作者:行者123 更新时间:2023-12-03 15:47:45 24 4
gpt4 key购买 nike

我有以下 SQL Server 2005 数据库架构:

CREATE TABLE Messages (
MessageID int,
Subject varchar(500),
Text varchar(max) NULL,
UserID NULL
)

“UserID”列 - 可以为空 - 是外键并链接到表
CREATE TABLE Users (
UserID int,
...
)

现在我有几个名称为 Message、User 等的 POCO 类,我在以下查询中使用它们:
public IList<Message> GetMessages(...) {
var q = (from m in dataContext.Messages.Include("User")
where ...
select m); // could call ToList(), but...

return (from m in q
select new Message {
ID = m.MessageID,
User = new User {
ID = m.User.UserID,
FirstName = m.User.FirstName,
...
}
}).ToList();
}

现在请注意,我建议 Entity Framework - 使用 Include("Users") - 加载与消息关联的用户(如果有)。另请注意,我不会在第一个 LINQ 语句之后调用 ToList()。通过这样做,只有投影列表中的指定列 - 在本例中为 MessageID、UserID、FirstName - 将从数据库中返回。

问题就在这里——只要 Entity Framework 遇到一条 UserID == NULL 的消息,它就会抛出一个异常,说它无法转换为 Int32,因为 DB 值为 NULL。

如果我将最后几行更改为
return (from m in q
select new Message {
ID = m.MessageID,
User = m.User == null ? null : new User {
ID = m.User.UserID,
...
}
}).ToList()

然后抛出一个运行时 NotSupportedException ,告诉它不能创建一个常量 User 类型,并且只支持像 int、string、guid 这样的原语。

除了在第一条语句之后立即实现结果并在之后使用内存中投影之外,任何人都知道如何处理它?谢谢。

最佳答案

您忘记包含“Message”类的声明,但我怀疑该类中的 UserID 属性未声明为可空类型。如果是这种情况,请将其从“int”更改为“int?” (可为空的 int)。

关于.net - Entity Framework 中的可空实体投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/140331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com