鑒于下一個作業 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"
}
我正在嘗試將其映射到下一個物件:
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 查詢的回傳(即動態串列)轉換為 View Model 物件,并且:
var test1 = catalogues.ToList().Cast<VideoGalleryVM1>().ToList();
以無效的強制轉換例外結束,并且
var test2 = catalogues.OfType<VideoGalleryVM1>().ToList();
以 0 個元素的串列結尾。
uj5u.com熱心網友回復:
您不需要所有的 Automapper,它是為簡單的場景創建的 - 將相似的 KNOWN 物件映射到另一個物件,如果映射簡單,則更好。如果您通過Select- 您可以在一個地方進行投影,而無需使用 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 使用指南
uj5u.com熱心網友回復:
好的,在掙扎了幾個小時之后,我發現將動態串列(LinQ 查詢的結果)轉換為 View Model 物件的唯一解決方案是:
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(或其他型別的演員表)不起作用,但這只是作業。
在我的例子中,我們談論的是一個沒有那么多屬性的類,而是一個長類的影像......這就是 Automapper 應該做的。
我希望這對其他人有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454032.html
上一篇:Linq如何根據嵌套串列屬性和外部串列的重疊過濾物件串列
下一篇:C#泛化排序方式
