簡體   English   中英

C# Automapper“不支持的映射”與列表<dynamic> LinQ 查詢結果</dynamic>

[英]C# Automapper "Unsupported Mapping" with List<dynamic> result of LinQ query

鑒於下一個工作 LinQ 查詢:

var catalogues = (from cat in db.CATALOGUES

                      join doc in db.DOCUMENTS_CATALOGS on
                      new { a = cat.PFK_ENTERPRISE, b = cat.FK_DOCUMENT_VIDEO }
                      equals
                      new { a = doc.PFK_ENTERPRISE, b = (int?)doc.PK_DOCUMENT }

                      join pos in db.DOCUMENTS_CATALOGS on
                      new { a = cat.PFK_ENTERPRISE, b = cat.FK_DOCUMENT }
                      equals
                      new { a = pos.PFK_ENTERPRISE, b = (int?)pos.PK_DOCUMENT }

                      where (cat.PFK_ENTERPRISE == enterpriseId && cat.PK_CATALOGUE == catalogueId)
                      orderby cat.DESC_CATALOGUE ascending
                      select new
                      {
                          cat.PK_CATALOGUE,
                          cat.FK_DOCUMENT_VIDEO,
                          cat.DESC_CATALOGUE,
                          doc.REAL_NAME,
                          doc.SERVER_NAME_ORIGINAL_FILE,
                          POSTER = pos.SERVER_NAME_ORIGINAL_FILE
                      });

這會產生一個帶有類似這樣的匿名列表的結果(我的情況下有 1 條記錄):

{ 
    PK_CATALOGUE = 212, 
    FK_DOCUMENT_VIDEO = 212, 
    DESC_CATALOGUE = "xxx", 
    REAL_NAME = "7_Category_Image_c3ab57e3-ec7e-4a80-aaa1-c6cc10a1b917.jpg", 
    SERVER_NAME_ORIGINAL_FILE = "7_Category_Image_c3ab57e3-ec7e-4a80-aaa1-c6cc10a1b917.jpg", 
    POSTER = "7_IMG_CATALOGUE_5d8e24eb-8a40-4e4d-9d86-a3f610d5b65e.jpg" 
}

我正在嘗試將 map 轉換為下一個 object:

public class VideoGalleryVM
{
    public int PK_CATALOGUE { get; set; }
    public int? FK_DOCUMENT_VIDEO { get; set; }
    public string DESC_CATALOGUE { get; set; }
    public string REAL_NAME { get; set; }
    public string SERVER_NAME_ORIGINAL_FILE { get; set; }
    public string POSTER { get; set; }
}

以下方式:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<object, VideoTrainingVM>().ReverseMap();
});

IMapper mapper = config.CreateMapper();

List<VideoGalleryVM> vgVM = mapper.Map<List<VideoGalleryVM>>(videoGallery);

但是無論我嘗試什么,我都會遇到“無效映射”類型的異常。

我不介意使用 Automapper,只需要將 LinQ 查詢(即動態列表)的返回值轉換為視圖 Model object,並且:

var test1 = catalogues.ToList().Cast<VideoGalleryVM1>().ToList();

以無效的強制轉換異常結束,並且

var test2 = catalogues.OfType<VideoGalleryVM1>().ToList();

以 0 個元素的列表結尾。

您不需要所有的 Automapper,它是為簡單的場景創建的 - 將相似的 KNOWN 對象映射到另一個對象,如果映射簡單,則更好。 如果您通過Select進行投影 - 您可以 map 將您需要的所有東西集中在一個地方,而無需使用 Automapper 的“魔法”。

因此,只需將您的結果投影到所需的對象類型中:

var catalogues = 
    from cat in db.CATALOGUES

    join doc in db.DOCUMENTS_CATALOGS on
    new { a = cat.PFK_ENTERPRISE, b = cat.FK_DOCUMENT_VIDEO }
    equals
    new { a = doc.PFK_ENTERPRISE, b = (int?)doc.PK_DOCUMENT }

    join pos in db.DOCUMENTS_CATALOGS on
    new { a = cat.PFK_ENTERPRISE, b = cat.FK_DOCUMENT }
    equals
    new { a = pos.PFK_ENTERPRISE, b = (int?)pos.PK_DOCUMENT }

    where (cat.PFK_ENTERPRISE == enterpriseId && cat.PK_CATALOGUE == catalogueId)
    orderby cat.DESC_CATALOGUE ascending
    select new VideoGalleryVM
    {
        PK_CATALOGUE = cat.PK_CATALOGUE,
        FK_DOCUMENT_VIDEO = cat.FK_DOCUMENT_VIDEO,
        DESC_CATALOGUE = cat.DESC_CATALOGUE,
        REAL_NAME = doc.REAL_NAME,
        SERVER_NAME_ORIGINAL_FILE = doc.SERVER_NAME_ORIGINAL_FILE,
        POSTER = pos.SERVER_NAME_ORIGINAL_FILE
    };

強烈建議閱讀 Automapperr 的創建者何時使用或不使用他的庫的文章。 創建文章是為了在以后支持映射很痛苦的情況下停止使用庫: AutoMapper 使用指南

我發現將我的動態列表(LinQ 查詢的結果)轉換為視圖 Model object 的唯一解決方案是:

var targetList = catalogues.Select(cat => new VideoGalleryVM() 
                { 
                    PK_CATALOGUE = cat.PK_CATALOGUE,
                    FK_DOCUMENT_VIDEO = cat.FK_DOCUMENT_VIDEO,
                    DESC_CATALOGUE = cat.DESC_CATALOGUE,
                    REAL_NAME = cat.REAL_NAME,
                    SERVER_NAME_ORIGINAL_FILE = cat.SERVER_NAME_ORIGINAL_FILE,
                    POSTER = cat.SERVER_NAME_ORIGINAL_FILE
                }).ToList();

我不認為是最好的選擇,甚至不明白為什么 Automapper(或其他類型的演員表)不起作用,但這只是工作。

在我的例子中,我們談論的是一個沒有那么多屬性的 class,但圖像是一個長的 class ......這就是 Automapper 應該做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM