3

我有以下 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();
}

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

问题就在这里——一旦实体框架遇到 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,告诉它不能创建常量用户类型,并且只支持 int、string、guid 等原语。

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

4

3 回答 3

2

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

于 2008-09-30T06:17:37.263 回答
0

我怀疑你们的关系不是一对一的。

于 2008-09-26T15:55:39.077 回答
0

既然你做了一个.Include("Users")你应该能够遍历对象User中的属性Message来获取你想要的信息。

于 2008-09-26T16:05:48.910 回答