2016-12-03 19 views
2

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クエリを追加することができました。

答えて

0

これを数日間苦労して、質問を投稿してから約10分後に解決策を見つけました。

public class Position 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public Position Superior { get; set; } 
} 

し、次のクエリは、私が期待したのと同様に動作します:

var result = 
    from pos in _context.Positions 
    select new PositionListViewModel() 
    { 
     Position = pos, 
     Superior = pos.Superior == null ? "None" : pos.Superior.Title 
    }; 

私はこれにエンティティモデルを変更しました
関連する問題