2010-11-02 7 views
2

Я получаю следующее сообщение об ошибке:LINQ Регистрация ошибок

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

при использовании кода ниже

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); 

То, что я пытаюсь сделать в LINQ, это создать мульти-условие объединения и я сталкиваюсь с проблемами. Есть идеи?

Спасибо,

+0

Как я уже говорил в комментарии ниже, вы можете быть заинтересованы в использовании SelectMany подход к выполнению соединений в LINQ к SQL. Это должно упростить вам вещи. См. [Когда предпочитают объединения, выраженные с помощью SelectMany() над объединениями, выраженные с ключевым словом join в Linq] (http://stackoverflow.com/q/4025871/59111). –

ответ

3

Попробуйте давать имена свойств в ваших анонимных объектов:

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: Хорошо, я должен признаться, я не специалист по синтаксису запросов, но вы хотите фильтровать список «пункты», прежде чем делать объединение, как показано на следующую беглую версию запроса:

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) 

ДРУГОГО EDIT: Пер предложение Ахмада:

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); 

ОЧЕРЕДНОЙ EDIT: На другой 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

Нет, извините. Я получаю следующие ошибки: 1) Локальная переменная с именем «i» не может быть объявлена ​​в этой области, поскольку она придавала бы значение «i», которое уже используется в области «родительский» или «текущий», чтобы обозначить что-то еще. 2) Невозможно преобразовать лямбда-выражение, чтобы набрать «bool», потому что это не тип делегата/ –

+0

. См. Edit, вы объявляете другую переменную с именем «i» в вашем «где», которая вызывает большинство этих ошибок. – diceguyd30

+1

Попробуйте переместить предложение 'where' до использования' items': 'join i в items.Where (o => o.contact_dt.Value.Year == date.Year && o.contact_dt.Value.Month == date .Month) ... '. 'I' не находится в области за пределами' join', но 'c' находится в области использования. EDIT: просто заметил ваш свободный синтаксис, ту же идею для синтаксиса запроса о размещении 'Where'. –

Смежные вопросы