2010-11-15 26 views
1

J'essaie d'optimiser une requête donc je l'ai branché sur LINQPAD mais je reçois toujours une erreur de référence nulle, je ne peux pas assigner de valeur nulle à System.Int32 .. quand je commente le FolderID à la fin, le erreur ne se produit plus. Pourquoi suppose-t-on que FolderID est un System.Int32 et comment puis-je en faire un Int32? Au lieu de cela, il est nullable et je peux exécuter la requête?Pourquoi LINQPAD suppose-t-il que cette variable est un System.Int32 et comment puis-je changer d'avis?

(from groupBundle in GroupBundles 
    join userGroup in UserGroups on groupBundle.GroupID equals userGroup.GroupID 
    join bundle in Bundles on groupBundle.BundleID equals bundle.BundleID 
    where userGroup.UserID == 75 
    orderby bundle.BundleName 
    select new 
    { 
     BundleID = bundle.BundleID, 
     BundleName = bundle.BundleName, 
     BundleIcon = bundle.BundleIcon, 
     UseSpecialPlayer = (bundle.UseSpecialPlayer != null && bundle.UseSpecialPlayer == true) ? true : false, 
     height = bundle.PuHeight, 
     width = bundle.PuWidth, 
     UserID = 75, 
     CompanyID = 32, 
     IsFavorite = ((from f in Favorites where f.FavoriteTypeID == 1 && f.UserID == 75 && f.ActionID == bundle.BundleID select f).Count() > 0) ? true : false, 

     //THIS ONE HERE 
     FolderID = (from cf in CategoryFolders 
      join folder in Folders on cf.FolderID equals folder.FolderID 
      where folder.CompanyID == 32 && 
      cf.CategoryID == bundle.BundleID 
      select cf.FolderID).FirstOrDefault() 
}).Distinct() 
+1

si vous downvote, s'il vous plaît commentaire ... ne sais pas pourquoi il en est une mauvaise question, ne savent pas où LINQPad devient l'idée de cette variable à partir car il est juste un nouvel objet créé à la volée ... droite? – BigOmega

+2

Pas que j'ai downvoted, mais vous pourriez * certainement * avoir simplifié votre exemple très significativement. Non seulement c'est inutilement complexe, mais c'est aussi incomplet - qu'est ce que UserGroups? Qu'est-ce que Bundles? Quels sont les types impliqués? Un exemple court mais * complet * aurait été beaucoup plus facile à utiliser. –

+0

ouais je comprends cela, mais je voulais juste tout inclure puisque je ne savais pas ce qui causait la chose à assumer ce que le type FolderIDs devrait être, maintenant qu'ils me l'ont signalé je vois que vous avez raison, je seulement J'avais besoin de cette dernière partie, je n'avais aucune idée de ce qui déterminait ce que FolderID devrait être – BigOmega

Répondre

3

Ajouter un casting à nullable int à l'expression étant attribué:

FolderID = (int?)(from cf in CategoryFolders 

est FolderID annulable dans la base de données? Si non, cela explique cela.

+0

Je ne suis pas sûr que FolderID soit dans la base de données car je déclare un nouvel objet ici ... Je ne sais pas où être référencer cela de. – BigOmega

+0

ah ah, cela a fonctionné et me permettra de continuer ma tâche, merci, je veux toujours savoir où il fait cette hypothèse, est-il basé sur ce que je sélectionne dans la sous-requête? car, évidemment, FolderID n'est défini nulle part. – BigOmega

+0

Oui, vous sélectionnez un nouvel objet anonyme. Mais vous le sélectionnez depuis: "from cf in CategoryFolders". Alors, quelle est la source IQueryable "CategoryFolders". Une source de données Linq-to-SQL, oui? Alors, il est défini dans la base de données, et le type de ce champ détermine le type que Linq-to-SQL utilisera pour le champ de l'objet dans le code. Avez-vous essayé le casting? Ça a marché? –

0

Je suppose que FolderId est dans une base de données quelque part, et je suppose qu'il est déclaré comme un type Nullable, peut-être même une colonne Int nullable.

0

Je suis désolé, je ne peux pas poster ce commentaire, mais je fais juste une requête pour ce travail?

//THIS ONE HERE 
    FolderID = (from cf in CategoryFolders 
     join folder in Folders on cf.FolderID equals folder.FolderID 
     where folder.CompanyID == 32 && 
     cf.CategoryID == bundle.BundleID 
     select cf.FolderID).FirstOrDefault()