首页 > 解决方案 > 如何制作匿名公共异步任务

问题描述

我有一个方法可以将对象作为列表返回。下线后,我意识到我必须加入几张桌子才能获得结果。问题出现在我的退货声明中,该声明指出:

无法将类型 System.Collections.Generic.List<> 隐式转换为 System.Collections.Generic.List<>。

如何修复我的代码以便返回我的连接结果?这是我的代码:

public async Task<List<McaMswcomapnionAuditCardPinrecords>> SearchPinRecords(string Region, [FromQuery] PaginationDTO pagination)
{

    var queryable = (from pinRecords in context.McaMswcomapnionAuditCardPinrecords
                     join transitRecords in context.AbmProdRegionTransitRecordsNew on pinRecords.TransitRecordId equals transitRecords.Id
                     join transitDescription in context.CommonTransitRecords on transitRecords.TransitRecordId equals transitDescription.Id
                     where pinRecords.RegionRecordId == Region && pinRecords.AuditComplete == false
                     select new
                     {


                     }
                     );

    await HttpContextExtensions.GetPage<McaMswcomapnionAuditCardPinrecords>(queryable, pagination.Page, pagination.QuantityPerPage);
    return await queryable.Paginate(pagination).ToListAsync();
}

标签: c#entity-framework

解决方案


匿名类型文档中的备注部分说:

匿名类型是直接从 object 派生的类类型,并且不能转换为除 object 之外的任何类型。编译器为每个匿名类型提供了一个名称,尽管您的应用程序无法访问它。

这告诉我们两件事:

  1. 编译器正在根据您定义匿名类型的方式为您创建一个类。因此,您不会通过自己创建类来节省任何处理时间或内存。和,
  2. 您无法访问匿名类的自动生成名称,因此您无法定义返回该类型的方法。(你可以投到object并返回List<object>,但这只会让事情变得更加困难)

解决方案是自己创建一个具有您打算返回的所有属性的命名类,然后返回该类型。

public class RecordWithDescription {
    public int TransitRecordId { get; set;}
    public string Description { get; set;}
    // etc.
}
public async Task<List<RecordWithDescription>> SearchPinRecords(string Region, [FromQuery] PaginationDTO pagination)
{

    var queryable = (from pinRecords in context.McaMswcomapnionAuditCardPinrecords
                     join transitRecords in context.AbmProdRegionTransitRecordsNew on pinRecords.TransitRecordId equals transitRecords.Id
                     join transitDescription in context.CommonTransitRecords on transitRecords.TransitRecordId equals transitDescription.Id
                     where pinRecords.RegionRecordId == Region && pinRecords.AuditComplete == false
                     select new RecordWithDescription
                     {
                         TransitRecordId = pinRecords.TransitRecordId,
                         Description = transitDescription.Description,
                         // etc.
                     }
                     );

    await HttpContextExtensions.GetPage<McaMswcomapnionAuditCardPinrecords>(queryable, pagination.Page, pagination.QuantityPerPage);
    return await queryable.Paginate(pagination).ToListAsync();
}

(我没有测试这段代码,所以你可能需要调整它,但它给了你这个想法)


推荐阅读