Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用存储库模式在BAL中左外部联接-null异常_C#_Entity Framework_Repository Pattern - Fatal编程技术网

C# 使用存储库模式在BAL中左外部联接-null异常

C# 使用存储库模式在BAL中左外部联接-null异常,c#,entity-framework,repository-pattern,C#,Entity Framework,Repository Pattern,我不太明白为什么下面的语法直接适用于实体框架 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

我不太明白为什么下面的语法直接适用于实体框架

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的参数必须引用基元、枚举或引用类型”而失败。存储库使用相同的entities对象

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!!!
使用repository模式,如果我将语法更改为

...
CategoryDescription = cg.Description
但如果我从列表中模拟存储库,它会失败,因为对象引用没有设置为对象的实例

我相信这与物化/非物化数据有关

在这些示例中,.DefaultIfEmpty显然返回了不同的结果,我正在考虑重写,如果为空,则始终返回NULL。我也不知道该怎么办

其思想是将业务逻辑隔离到服务层,而不是存储库中。虽然连接表可能是“非”BL,并且在存储库中也可以吗?如何使用此模式进行复杂连接

是否无法使用存储库进行IQueryable连接

更新 添加了存储库中GetIQueryable方法的示例

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();
    }
公共类类别
{
公共字符串代码{get;set;}
公共字符串说明{get;set;}
}
公共IQueryable GetIQueryable()
{
返回(来自entities.categories中的c)
选择新类别
{
代码=c代码,
Description=c.描述符
}).AsQueryable();
}
问题在于:

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

            }).AsQueryable();
}
  • 使用另一个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();
    }
    
    class categorydo
    {
    公共整数代码{get;set;}
    公共字符串说明{get;set;}
    }
    //...
    公共IQueryable GetIQueryable()
    {
    返回(来自entities.categories中的c)
    选择“新建类别到”
    {
    代码=c代码,
    Description=c.描述符
    }).AsQueryable();
    }
    

  • Show
    GetIQueryable
    方法我忘记了那个方法,…现在在
    GetIQueryable
    中添加了一个例子:为什么不简单地
    返回entities.categories?那里的
    类别是什么?你用的是什么EF?EF6不允许投影到实体类。闻起来像EF核心。我用的是EF5。创建Category类的原因是为了将EF对象映射到POCO。存储库是一个接口,用于支持使用模拟存储库进行测试。存储库不是数据模型类。方法1将返回实体对象“category”,而不是poco对象类别。我认为方法2实际上就是我正在使用的。类别是DTO对象(poco与ef无关)。
    
    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();
    }