2010-06-09 3 views
2

Je suis nouveau à linq et j'essaye de rediriger vers un type anonyme. J'utilise SubSonic 3.0 comme DAL.LINQ, l'erreur "Les types d'argument ne correspondent pas", qu'est-ce que cela signifie, comment l'adresser?

que je fais une sélection de 2 tables comme si

 var myDeal = (from u in db.Users 
        select new 
         { 
          UserID = u.UserID, 
          UserRoleID = (from ur in u.UserRoles where u.UserRoleID == ur.UserRoleID select ur).FirstOrDefault().UserRoleID 
         }); 
    foreach (var v in myDeal) //dies first time here 
    { 
    } 

Puis, quand je Databind ou essayer de parcourir la collection, je l'erreur « Les types d'argument ne correspondent pas » au cours de l'exécution.

Je ne suis pas sûr de ce qui se passe ici.

+1

La requête échouent toujours si vous venez itérer dessus aller chercher les résultats, à savoir sans la liaison de données? –

+0

Oui, je mets un foreach juste après et il meurt la première fois que je le vois. –

+0

Si vous vérifiez dans le débogueur quel est le type de 'myDeal'? – ChrisF

Répondre

2

L'un des champs d'ID peut-il être validé?

Si oui, vous devez accéder à la propriété .Value

var myDeal = (from u in db.Users 
     join ur in  
       select new 
        { 
        UserID = u.UserID, 
        UserRoleID = (from ur in u.UserRoles where u.UserRoleID.Value equals ur.UserRoleID select ur).FirstOrDefault().UserRoleID 
        }); 

Vous pouvez également essayer quelque chose comme ceci:

var myDeal = (from u in db.Users 
     join ur in db.UserRoles 
     on new {ID = u.UserRoleID.value} equals new {ID = ur.UserRoleID} into tempRoles 
     from roles in tempRoles.DefaultIfEmpty() 
     select new 
     { 
      UserID = u.UserID, 
       UserRoleID = roles.UserRoleID 
     }); 

Vous utilisez tempRoles pour exécuter une jointure externe gauche. Donc, si aucun rôle n'est assigné, vous obtenez toujours l'ID utilisateur.

Je n'ai pas testé cela, c'est juste sur le dessus de ma tête.

Bonne chance,

Patrick.

+0

Merci Patrick Je vais l'essayer! –

+0

Je ne pouvais pas le faire fonctionner :(revenant à l'enregistrement actif sur celui-ci Merci quand même. –

1

L'erreur "Les types d'argument ne correspondent pas" est généralement causée par le type non concordant entre la propriété que nous souhaitons lier et son élément.

exemple dans RadGridSparkline, quand nous voudrions lier sa source d'élément

type "Value" doit être double. Si nous avons la propriété Value définie comme ci-dessous public decimal ContractValue {set; obtenir; }

Cette erreur s'affiche

Questions connexes