2010-11-02 6 views
2

que je reçois l'erreur suivante:LINQ erreurs Rejoignez

The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'. 

lorsque vous utilisez le code ci-dessous

var ccrCodes = (from c in db.CCRCodes 
       join i in items on 
       new { c.baan_cat_fam_code, c.baan_cat_code } equals 
       new { i.baan_cat_family_code, i.baan_cat_code } 
       where i => i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month 
       select c).Distinct().OrderBy(c => c.code_desc); 

Ce que je suis en train de faire dans LINQ est de créer une condition à plusieurs rejoindre et Je cours dans des problèmes. Des idées?

Merci,

+0

Comme je l'ai mentionné dans un commentaire ci-dessous, vous pourriez être intéressé à utiliser l'approche SelectMany pour effectuer des jointures dans LINQ to SQL. Cela devrait simplifier les choses pour vous. Voir [Quand faut-il préférer les jointures exprimées avec SelectMany() sur les jointures exprimées avec le mot-clé de jointure dans Linq] (http://stackoverflow.com/q/4025871/59111). –

Répondre

3

Essayez de donner des noms aux propriétés de vos objets anonymes:

var ccrCodes = (from c in db.CCRCodes 
       join i in items on 
       new { FamCode = c.baan_cat_fam_code, CatCode = c.baan_cat_code } equals 
       new { FamCode = i.baan_cat_family_code, CatCode = i.baan_cat_code } 
       where i => i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month 
       select c).Distinct().OrderBy(c => c.code_desc); 

EDIT: D'accord, je dois avouer, je ne suis pas expert sur la syntaxe de requête, mais vous souhaitez filtrer la liste « éléments » avant de faire la jointure, comme la version couramment suivante de votre requête:

db.CCRCodes 
    .Join(
     items.Where(i => i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month), 
     x => new { FamCode = x.baan_cat_fam_code, CatCode = x.baan_cat_code }, 
     x => new { FamCode = x.baan_cat_family_code, CatCode = x.baan_cat_code }, 
     (o,i) => o 
    ).Distinct().OrderBy(c => c.code_desc) 

AUTRE EDIT: par la suggestion de Ahmad:

var ccrCodes = (from c in db.CCRCodes 
        join i in items.Where(x => x.contact_dt.Value.Year == date.Year && x.contact_dt.Value.Month == date.Month) on 
        new { FamCode = c.baan_cat_fam_code, CatCode = c.baan_cat_code } equals 
        new { FamCode = i.baan_cat_family_code, CatCode = i.baan_cat_code } 
        select c).Distinct().OrderBy(c => c.code_desc); 

UNE AUTRE EDIT: Par une autre suggestion Ahmad:

var ccrCodes = (from c in db.CCRCodes 
       from i in items 
       where i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month 
        && c.baan_cat_fam_code == i.baan_cat_family_code && c.baan_cat_code == i.baan_cat_code 
       select c).Distinct().OrderBy(c => c.code_desc); 
+0

Non, désolé. J'obtiens les erreurs suivantes: 1) Une variable locale nommée 'i' ne peut pas être déclarée dans cette portée car elle donnerait un sens différent à 'i', qui est déjà utilisé dans une portée 'parent ou current' pour désigner autre chose. 2) Impossible de convertir l'expression lambda en type 'bool' car ce n'est pas un type délégué/ –

+0

Voir edit, vous déclarez une autre variable appelée 'i' dans votre 'where' qui cause la majorité de ces erreurs. – diceguyd30

+1

Essayez de déplacer la clause 'where' jusqu'à l'utilisation de' items': 'rejoindre i dans items.Where (o => o.contact_dt.Value.Year == date.Year && o.contact_dt.Value.Month == date .Month) ... '. Le 'i' n'est pas dans le champ après le' join', mais 'c' est dans la portée de l'utilisation. EDIT: juste noté votre syntaxe courante, même idée pour la syntaxe de requête sur le placement 'Where'. –