null 許容および null 非許容の int に対する 'join' の呼び出しで型推論が失敗しました
-
27-10-2019 - |
質問
私の Linq では、null 許容フィールドへの内部結合を作成しようとしています。従業員と部門には関係があり、部門には EmployeeID がある場合もあれば、null がある場合もあります。それでは、内部結合を満たすレコードのみが必要な場合 (null EmployeeID の場合は結果なし)、結合はどうなるでしょうか。
var result = from emp in employees
join dept in departments
on new { Source = emp.EmployeeID }
equals new { Source = dept.EmployeeID };
例外が発生します:
結合句内のいずれかの式の型が正しくありません。「結合」の呼び出しで型推論が失敗しました。
ありがとう
解決
参加を逆転させて少し置いたらどうなりますか 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 };
他のヒント
intを比較するには?およびint、append .Value
無視可能なプロパティへ:
var result = from emp in employees
join dept in departments
on new { Source = emp.EmployeeID }
equals new { Source = dept.EmployeeID.Value };
タイプを確認してください emp.EmployeeID
と dept.EmployeeID
. 。それらが違う場合、あなたはキャストを逃しているかもしれません。
何かのようなもの:
on new { Source = emp.EmployeeID }
equals new { Source = **(int)**dept.EmployeeID };
ように見えます emp.EmployeeID
タイプです int
と dept.EmployeeID
タイプです nullable<int>
.
私は同じ問題を抱えていましたが、charge_codes.companyidはnulableでしたが、私のrodder_items.companyidはnullableではありませんでした。
だから私は自分の充電コードを独自の異質なタイプに入手し、それを気付かないようにしなければなりませんでした。
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}
複数値のキーを結合するには、同じ型である「equals」の両側に匿名型を構築する必要があります。匿名型初期化子の式は、指定した式からメンバーの型と名前の両方を推測します。あなたの場合、メンバーの名前が異なるため、型も異なることになるため、C# は 2 つの共通の型を理解できません。
new { VC.Make, VC.Model } は new { MD.MakeID, MD.RefNum } と等しい
あるべきです
new { VC.Make, CV.Model } は new { Make = MD.MakeID, Model = MD.RefNum } と等しい
イニシャライザで name = value 構文を使用すると、型の作成時にコンパイラが使用する名前を指定できます。すべてのメンバーの型と名前が同じである場合、匿名型は同じ型になります。
私のシナリオでは、複数の列を使用して結合でこのエラーが発生しました。プロパティ名は異なっていて、そのうちの1つも気付かれませんでした。私がしたことは、それらのプロパティに名前を作成し、nullable値に「.value」を追加して、Linq結合がそれらのプロパティを正しく関連付けることだけでした。
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 }
私はそれがこの問題に直面している人を助けることを願っています。