EFコア1.1.0で左結合を実装しようとしています。私は以前のバージョンで問題があったことを知っていますが、これは今修正されたと思いました。それに、EF6でも同じ問題があるので、間違っていると思う。左外部結合エンティティフレームワークコア1.1.0
私のテーブルには、組織内の役職が含まれています。
public class Position
{
public int ID { get; set; }
public string JobTitle { get; set; }
public int SuperiorID { get; set; }
}
SuperiorID
同じテーブル内の別のレコードを指し、またはゼロ該当しない場合:私は、次のエンティティモデルを持っています。
私は、次のビューモデルがあります:
public class PositionListViewModel
{
public Position Position { get; set; }
public string Superior { get; set; }
}
を私はLINQPadで次のクエリを実行すると、結果が期待どおりに、次のとおりです。
from pos in Positions
join sup in Positions on pos.SuperiorID equals sup.ID into temp
from sup in temp.DefaultIfEmpty()
select new {pos, sup.JobTitle}
しかし、私は自分のアプリケーションでこのクエリをしようとすると、 :
var result =
from pos in _context.Positions
join sup in _context.Positions on pos.SuperiorID equals sup.ID into temp
from sup in temp.DefaultIfEmpty()
select new PositionListViewModel() { Position = pos, Superior = sup.JobTitle };
がnullでエラーが返される.get_Items requires calling method System.RuntimeType.IsEnumDefined, which cannot be called in this context. Unable to evaluate the expression. Operation not supported. Unknown error: 0x80070057
。私はこのエラーで何かを見つけることができませんでした。匿名型を返そうとすると同じエラーが発生します。
私は、エンティティモデルに余分なフィールドSupTitle
を追加し、.fromSql
を使用して、それを回避することができますが、これは厄介な感じ、私は後で追加のクエリに参加する追加したい場合は、非常に厄介になると思います。
var result = _context.Positions.FromSql(
"SELECT [t0].[ID], [t0].[Title], [t0].[SuperiorID], [t1].[Title] AS [SupTitle] " +
"FROM [Positions] AS [t0] LEFT OUTER JOIN [Positions] AS [t1] " +
"ON [t0].[SuperiorID] = [t1].[ID]");
私はそれは、内側がinto
句とDefaultIfEmpty()
行を削除することで参加させる場合、それは私がSuperiorID == 0
行を取得していない、明らかに動作しますが。
何か間違っていますか?そうでない場合は、2つのクエリを実行して結果をビューに送信する前にマージできますか?そのようにして、内部結合を実行し、単純なwhere SuperiorID == 0
クエリを追加することができました。