2017-06-28 10 views
0

以下の構文がEntity Frameworkに直接正しく動作する理由はわかりません。リポジトリパターンを使用してBALに外部結合を残しました - null例外

var query = (from c in entitites.car 
      join cat in entitites.categories on c.code equals cat.code into categoriesGroup 
      from cg in categoriesGroup.DefaultIfEmpty() 

      select new CarListModel 
      { 
       Car = c,    
       CategoryDescription = cg == null ? null : cg.Description 
      }); 

var test = query.ToList(); //Success 

私のリポジトリからiqueryablesで同じクエリを実行すると失敗しますが、「DbIsNullExpressionへの引数は、プリミティブ、列挙または参照タイプを参照する必要があります。」リポジトリは同じエンティティオブジェクトを使用します。リポジトリパターンを使用して

var queryCars = carRepository.GetIQueryable(); 
var queryCategory = categoryRepository.GetIQueryable(); 

var query = (from c in queryCars 
      join cat in queryCategory on c.Code equals cat.Code into categories 
      from cg in categories.DefaultIfEmpty() 

      select new CarListModel 
      { 
       Car = c,    
       CategoryDescription = cg == null ? null : cg.Description 
      }); 

var test = query.ToList(); // Fails!!! 

、私は

... 
CategoryDescription = cg.Description 

に構文を変更しかし、私はリストからリポジトリをモックアップならば、それはオブジェクト参照がオブジェクトのインスタンスに設定されていないとfailes場合、それが動作しません。

これは、マテリアライズ/非マテリアライズドデータの場合とは何か関係があります。

.DefaultIfEmptyは明らかにこれらの例では別の結果を返します。空の場合は常にNULLを返すようにオーバーライドを検討していました。私はこれについてどうやって行くかわからない。

アイデアは、ビジネスロジックをリポジトリではなくサービス層に分離することです。おそらくテーブルを結合することはBLではなく、リポジトリには問題ありませんか?どのようにこのパターンを使用して複雑な結合を行うには?

リポジトリを使用してIQueryable結合を行うことはできませんか?

更新!

public IQueryable<Category> GetIQueryable() 
{ 
    return (from c in entities.categories 
      select new Category 
      { 
       Code = c.code, 
       Description = c.descripton 

      }).AsQueryable(); 
} 

Categoryがテーブルにマッピングされた(データモデルクラスですので、あなたは、クエリでnew Categoryを使用することはできません:

public class Category 
{ 
    Public string Code {get;set;} 
    Public string Description {get; set;} 
} 

public IQueryable<Category> GetIQueryable() 
    { 
     return (from c in entities.categories 
       select new Category 
       { 
        Code = c.code, 
        Description = c.descripton 

       }).AsQueryable(); 
    } 
+0

ショー 'GetIQueryable'方法 – Backs

+0

あなたは、2つのオプションを持っています1つ、...ここにその例を追加しました – Kman

+0

'GetIQueryable':単純に' return ent ities.categories; '?そこに 'Category'クラスは何ですか? EFは何を使用していますか? EF6では、エンティティクラスに投影することはできません。 EFコアのような香り。 –

答えて

0

問題はここにあるリポジトリからGetIQueryable方法の一例を追加しました)。

  1. 書き換えクエリnewなし::

    public IQueryable<Category>GetIQueryable() 
    { 
        return (from c in entities.categories 
          select c).AsQueryable(); 
    } 
    
  2. 別のDTOが、結果としてオブジェクトを使用してください:私がいることを忘れてしまった

    class CategoryDto 
    { 
        public int Code {get;set;} 
        public string Description {get;set;} 
    } 
    
    //... 
    
    public IQueryable<CategoryDto> GetIQueryable() 
    { 
        return (from c in entities.categories 
          select new CategoryDto 
          { 
           Code = c.code, 
           Description = c.descripton 
          }).AsQueryable(); 
    } 
    
+0

カテゴリはデータモデルクラスではありません。それはカテゴリです。メソッド1は、pocoオブジェクトカテゴリではなく、エンティティオブジェクト 'category'を返します。私は方法2が実際に私が使っているものだと思う。 CategoryはDTOオブジェクトです(efとは関係のないpoco)。 – Kman

関連する問題