Вывод типа завершился неудачно при вызове «join» в обнуляемых и ненулевых int - PullRequest
9 голосов
/ 08 сентября 2011

В моем Linq я пытаюсь сделать внутреннее соединение с обнуляемым полем.Сотрудник и отдел имеют отношение, отдел может иметь идентификатор сотрудника или может иметь нулевое значение.Так что будет моим соединением, если я хочу только записи, удовлетворяющие внутреннему соединению (без результатов для нулевых EmployeeID):

var result = from emp in employees
             join dept in departments
             on new { Source = emp.EmployeeID }
             equals new { Source = dept.EmployeeID };

Я получаю исключение:

Неверный тип одного из выражений в предложении соединения.Ошибка ввода типа при вызове «join».

Спасибо

Ответы [ 6 ]

9 голосов
/ 08 сентября 2011

Что если вы измените свое соединение и добавите туда немного where?

var result = from department in departments
             where department.EmployeeID != null
             join employee in employees
             on department.EmployeeID.Value equals employee.EmployeeID
             select new { employee, department };
8 голосов
/ 09 июля 2012

Для сравнения Int?и Int, добавьте .Value к свойству Nullable:

1 голос
/ 17 декабря 2017

Нашел полезный ответ по другой ссылке в https://social.msdn.microsoft.com/Forums/en-US/bf98ec7a-cb80-4901-8eb2-3aa6636a4fde/linq-join-error-the-type-of-one-of-the-expressions-in-the-join-clause-is-incorrect-type-inference?forum=linqprojectgeneral

Чтобы объединить многозначные ключи, вам нужно создать анонимный тип по обеим сторонам от «равно», который является тем же типом.Выражение инициализатора анонимного типа выводит как тип, так и имя членов из предоставленного вами выражения.В вашем случае имена членов разные, поэтому типы в конечном итоге различаются, поэтому C # не может определить общий тип между ними.

на новом {VC.Make, VC.Model} равно новому {MD.MakeID, MD.RefNum}

должно быть

на новом {VC.Make, CV.Model} равно новому {Make = MD.MakeID, Model = MD.RefNum}

Используя синтаксис name = value в инициализаторе, вы можете указать имя, которое компилятор использует при создании типа.Если все типы и имена членов совпадают, то анонимные типы имеют одинаковый тип.

1 голос
/ 21 июля 2015

У меня была та же проблема, когда мой charge_codes.CompanyId был обнуляемым, но мой order_items.CompanyId НЕ обнулялся.

Таким образом, я должен был получить свои коды зарядов в их собственном аномном типе и сделать так, чтобы они не обнулялись.

var chargeCodes = from s in db.Charge_Codes
where s.CompanyID != null
select new { CompanyID = (int)s.CompanyID, 
             Charge_CodeID = s.Charge_CodeID, 
             Revenue_Code_Id = (int)s.Revenue_CodeID, };



//now my chargeCodes contains an anonymous with a non nullable CompanyID and 
//a non nullable Revenue_CodeID 

//use chargeCodes here
var query = from oi in db.Order_Items
join cc in chargeCodes on 
new {oi.CompanyID, oi.Charge_CodeID} equals new {cc.CompanyID, cc.Charge_CodeID}
1 голос
/ 13 мая 2013

Проверьте тип на emp.EmployeeID и dept.EmployeeID. Возможно, вам не хватает состава, если они разные.

что-то вроде:

on new { Source = emp.EmployeeID }
equals new { Source = **(int)**dept.EmployeeID };

Похоже, emp.EmployeeID имеет тип int, а dept.EmployeeID имеет тип nullable<int>.

0 голосов
/ 28 июня 2018

В моем сценарии у меня была эта ошибка при объединении с использованием нескольких столбцов. Имена свойств были разными, и одно из них также могло быть обнуляемым Все, что я сделал, это создал имя для этих свойств и добавил «.Value» к значению Nullable, чтобы LINQ Join мог правильно связать эти свойства.

var query = from y in Context.Table1
        join y in Context.Table2 on new { Field1 = x.Field1.Value, Field2 = x.Field2 }
        equals new { Field1 = y.Field1DiffName, Field2 = y.Field2 }

Надеюсь, это поможет любому, кто столкнется с этой проблемой.

...