以下の構文が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();
}
ショー 'GetIQueryable'方法 – Backs
あなたは、2つのオプションを持っています1つ、...ここにその例を追加しました – Kman
'GetIQueryable':単純に' return ent ities.categories; '?そこに 'Category'クラスは何ですか? EFは何を使用していますか? EF6では、エンティティクラスに投影することはできません。 EFコアのような香り。 –