2011-11-16 98 views
1

我想选择TeamMembers,如果可用,选择相关的用户。实体框架 - linq和空值

public IEnumerable<RetailersFiveTeamMember> GetRetailersFiveTeamMembers(int retailLeaderID) 
    { 
     var members = this.EntityDataModel.DD_RetailersFiveTeamMember.Where(d => d.CMS_User1.UserID == retailLeaderID) 
      .Select(d => new RetailersFiveTeamMember 
     { 
      DateCreated = d.DateCreated, 
      Email = d.Email, 
      User = new CMSUser() { UserEnabled = d.CMS_User.UserEnabled } 
     }).ToArray(); 

     return members; 

如果我执行这个查询,我得到以下错误(这是预期的,因为CMS_User可以为null):

演员阵容价值型Boolean失败,因为物化价值是null。结果类型的泛型参数或查询都必须使用可为空的类型。

然后我用这段代码试了一下:

User = d.CMS_User == null ? null : new CMSUser() { UserEnabled = d.CMS_User.UserEnabled } 

然后我得到这个异常:

无法创建MsRetailClub.Core.Entities.RetailersFive.CMSUser类型的恒定值。在此上下文中仅支持基本类型(如Int32StringGuid)。

任何人都可以告诉我正确的方法吗? 非常感谢!

+0

看来你的问题与CMS_User1关系。 –

+1

为什么不写用户= d.CMS_User? – Svarog

+0

Hey Svarog:d.CMS_User有很多我不需要的属性。所以如果可能的话我想选择我想要的属性。 –

回答

1

我认为这不是说d.CMS_User的值为空(我认为这个异常会像'对象引用等等'),但d.CMS_User.UserEnabled为空。

如果相应的数据库字段是可为空的布尔值,则会发生这种情况。然后,您可以将其映射到C#中的可空布尔值(bool?)或使用缺省值作为空值。

我建议改变CMSUser的definiton使用

public bool? UserEnabled {get; set;} 

,但你也可以做

... 
User = new CMSUser() 
{ 
    UserEnabled = d.CMS_User.UserEnabled ?? false; 
} 
...