2011-11-16 4 views
1

Je souhaite sélectionner TeamMembers et, si disponible, l'utilisateur associé.Entity Framework - valeurs linq et null

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; 

Si j'exécute cette requête, je reçois l'erreur suivante (qui est prévu, parce que le CMS_User peut être null):

Le casting type de valeur Boolean a échoué parce que la valeur matérialisée est null. Le paramètre générique du type de résultat ou la requête doit utiliser un type Nullable.

Je l'ai essayé avec ce morceau de code:

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

Puis-je obtenir cette exception:

Impossible de créer une valeur constante de type MsRetailClub.Core.Entities.RetailersFive.CMSUser. Seuls les types primitifs (tels que Int32, String et Guid) sont pris en charge dans ce contexte.

Quelqu'un peut-il me montrer la bonne façon de faire cela? Merci beaucoup!

+0

semble que votre problème est lié à la relation CMS_User1. –

+1

Pourquoi ne pas écrire User = d.CMS_User? – Svarog

+0

Hey Svarog: d.CMS_User a beaucoup de propriétés dont je n'ai pas besoin. Donc, si possible, je voudrais sélectionner mes propriétés souhaitées. –

Répondre

1

Je pense que ce n'est pas que la valeur d.CMS_User est nulle (je pense que l'exception serait quelque chose comme 'Object reference etc ...'), mais que le d.CMS_User.UserEnabled est nul.

Cela se produira si le champ de base de données correspondant est un booléen Nullable. Ensuite, vous pouvez le mapper à un booléen Nullable en C# (bool?) ou utiliser une valeur par défaut pour null.

Je suggère de changer le definiton de CMSUser utiliser

public bool? UserEnabled {get; set;} 

mais vous pouvez également faire

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