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# 在N层数据应用程序中使用异步_C#_Entity Framework_Asynchronous_Async Await_N Tier Architecture - Fatal编程技术网

C# 在N层数据应用程序中使用异步

C# 在N层数据应用程序中使用异步,c#,entity-framework,asynchronous,async-await,n-tier-architecture,C#,Entity Framework,Asynchronous,Async Await,N Tier Architecture,我当前使用的应用程序不支持异步执行。 我的目标是使一个三层n层同步应用程序支持异步调用 Web [HttpPost("GetOrganisations")] public OrganisationViewModel GetOrganisations([FromBody] GetOrganisationModel model) { List<OrganisationModel> organisations = _organisationService.GetOrganisati

我当前使用的应用程序不支持异步执行。 我的目标是使一个三层n层同步应用程序支持异步调用

Web

[HttpPost("GetOrganisations")]
public OrganisationViewModel GetOrganisations([FromBody] GetOrganisationModel model)
{
    List<OrganisationModel> organisations = _organisationService.GetOrganisations(model?.Id, model?.StatusIds).ToList();

    return new OrganisationViewModel()
    {
        Organisations = organisations
    };
}
[HttpPost(“GetOrganizations”)]
公共组织视图模型GetOrganizations([FromBody]GetOrganizationModel模型)
{
列出组织=_OrganizationService.getOrganizations(model?.Id,model?.StatusIds).ToList();
返回新组织视图模型()
{
组织=组织
};
}
业务

public IEnumerable<OrganisationModel> GetOrganisations(int? organisationId, List<int> statusIds)
{
    return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel()); //ToModel = Remapping to business model using extension
}

public static class OrganisationExtensions
{
    public static OrganisationEntity ToEntity(this OrganisationModel model)
    {
        if (model == null) return null;

        OrganisationEntity entity = Mapper.Map<OrganisationModel, OrganisationEntity>(model);

        return entity;
    }

    public static OrganisationModel ToModel(this OrganisationEntity entity)
    {
        if (entity == null) return null;

        OrganisationModel model = Mapper.Map<OrganisationEntity, OrganisationModel>(entity);

        model.StatusName = entity?.Status?.Name;

        return model;
    }
}
public Task<IEnumerable<OrganisationModel>> GetOrganisations(int? organisationId, List<int> statusIds)
{
    return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel());
}
public IEnumerable GetOrganizations(int?OrganizationID,列表状态ID)
{
返回_OrganizationRepository.getOrganizations(OrganizationID,StatusID)。选择(m=>m.ToModel());//ToModel=使用扩展重新映射到业务模型
}
公共静态类组织扩展
{
公共静态组织实体到实体(此组织模型)
{
if(model==null)返回null;
OrganizationEntity=Mapper.Map(模型);
返回实体;
}
公共静态组织模型ToModel(该组织实体)
{
if(entity==null)返回null;
OrganizationModel=Mapper.Map(实体);
model.StatusName=实体?.Status?.Name;
收益模型;
}
}
数据

public IEnumerable<OrganisationEntity> GetOrganisations(int? organisationId, List<int> statusIds)
{
    IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();

    if (organisationId != null && organisationId > 0)
    {
        organisations = organisations.Where(o => o.Id == organisationId);
    }

    if (statusIds != null && statusIds.Count > 0)
    {
        organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
    }

    return organisations;
}
public async Task<List<OrganisationEntity>> GetOrganisations(int? organisationId, List<int> statusIds)
{
    IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();

    if (organisationId != null && organisationId > 0)
    {
        organisations = organisations.Where(o => o.Id == organisationId);
    }

    if (statusIds != null && statusIds.Count > 0)
    {
        organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
    }

    return await organisations.ToListAsync();
}
public IEnumerable GetOrganizations(int?OrganizationID,列表状态ID)
{
IQueryable Organizations=DB.organization.Include(“Status”).OrderByDescending(d=>d.Created).AsQueryable();
如果(OrganizationID!=null&&OrganizationID>0)
{
组织=组织。其中(o=>o.Id==组织Id);
}
if(statusIds!=null&&statusIds.Count>0)
{
Organizations=Organizations.Where(o=>StatusId.Contains(o.StatusId));
}
返回组织;
}
如何使此代码异步? 业务层中的映射扩展使这变得越来越困难

是否有必要一直“冒泡”异步/等待调用

让我试一试。。 数据

public IEnumerable<OrganisationEntity> GetOrganisations(int? organisationId, List<int> statusIds)
{
    IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();

    if (organisationId != null && organisationId > 0)
    {
        organisations = organisations.Where(o => o.Id == organisationId);
    }

    if (statusIds != null && statusIds.Count > 0)
    {
        organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
    }

    return organisations;
}
public async Task<List<OrganisationEntity>> GetOrganisations(int? organisationId, List<int> statusIds)
{
    IQueryable<OrganisationEntity> organisations = DB.Organisation.Include("Status").OrderByDescending(d => d.Created).AsQueryable();

    if (organisationId != null && organisationId > 0)
    {
        organisations = organisations.Where(o => o.Id == organisationId);
    }

    if (statusIds != null && statusIds.Count > 0)
    {
        organisations = organisations.Where(o => statusIds.Contains(o.StatusId));
    }

    return await organisations.ToListAsync();
}
公共异步任务GetOrganizations(int?OrganizationID,列表状态ID)
{
IQueryable Organizations=DB.organization.Include(“Status”).OrderByDescending(d=>d.Created).AsQueryable();
如果(OrganizationID!=null&&OrganizationID>0)
{
组织=组织。其中(o=>o.Id==组织Id);
}
if(statusIds!=null&&statusIds.Count>0)
{
Organizations=Organizations.Where(o=>StatusId.Contains(o.StatusId));
}
返回等待组织。ToListSync();
}
业务

public IEnumerable<OrganisationModel> GetOrganisations(int? organisationId, List<int> statusIds)
{
    return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel()); //ToModel = Remapping to business model using extension
}

public static class OrganisationExtensions
{
    public static OrganisationEntity ToEntity(this OrganisationModel model)
    {
        if (model == null) return null;

        OrganisationEntity entity = Mapper.Map<OrganisationModel, OrganisationEntity>(model);

        return entity;
    }

    public static OrganisationModel ToModel(this OrganisationEntity entity)
    {
        if (entity == null) return null;

        OrganisationModel model = Mapper.Map<OrganisationEntity, OrganisationModel>(entity);

        model.StatusName = entity?.Status?.Name;

        return model;
    }
}
public Task<IEnumerable<OrganisationModel>> GetOrganisations(int? organisationId, List<int> statusIds)
{
    return _organisationRepository.GetOrganisations(organisationId, statusIds).Select(m => m.ToModel());
}
公共任务组织(int?组织ID,列表状态ID)
{
return _OrganizationRepository.getOrganizations(OrganizationID,StatusID)。选择(m=>m.ToModel());
}
“Task>”不包含“Select”的定义,并且找不到接受“Task>”类型的第一个参数的扩展方法“Select”


我知道我可以很容易地在业务层等待结果,但这不是使用异步的错误方法吗?据我所知,我应该在weblayer等待结果,并在使用async时以某种方式将数据模型映射到业务模型。

async确实需要全部或全部才能有效。如果您在调用堆栈的任何位置都有一个阻塞调用,那么您的可伸缩性或多或少会降低

就实体框架而言,让您的数据层直接返回
IQueryable
,而不是返回列表可能会很有用。这可以让你灵活地升级你的应用程序,而不是一次全部升级

  • 无需更改映射即可使所有调用异步
  • 您遇到此错误“Task>”不包含“Select”的定义,并且找不到接受类型为“”的第一个参数的扩展方法“Select”,因为您需要等待调用
  • 公共任务组织(int?组织ID,列表状态ID)
    {
    返回(wait_organizationrepository.getorganizations(organizationid,statusid))。选择(m=>m.ToModel());
    }
    
  • 您应该将异步方法命名为GetOrganizationsAsync
  • 您还需要在WebAPI层等待。它看起来像这样
  • [HttpGet]
    公共异步任务GetOrganizations(int?OrganizationID,[FromUri]int[]StatusID)
    {
    返回OK(等待_businessObject.getOrganizations(OrganizationID,StatusID));
    }
    

    是否有必要一直“冒泡”异步/等待调用。是的,只要您使用
    .Wait()
    .Result
    剪切某个位置,该方法仍将阻塞。如果您有异步操作,请使用异步。这些操作真的是异步的吗?或者是封锁行动?您的ORM支持异步吗@Gonzalo.-返回等待组织。ToListSync();在您的业务代码中,您需要等待
    return await\u organizationrepository.getorganizations(Organism…
    @Niraj)-但这会阻止我向调用者发送异步消息,我不应该在webapi上等待结果吗?如果我不“冒泡”,它是否会失去“意思”异步到调用方?正如其他人回答的那样。您需要一直等到webapi层。更新了答案。因此,通过在我的业务层中使用wait,我还可以进行同步?如果在web api中有更多类似这样的数据库调用,我仍然需要等待业务层中的每个请求?wait和和同步调用。同步调用会阻止线程在那里等待,而等待线程可以自由执行其他任务。我建议您参考Ok。在我接受您的回答之前,还有最后一个问题。您认为这种代码设计不适合异步调用吗?您会采取不同的做法吗?我的意思是,这种设计会导致cks?阻止任何行动?谢谢