首页 > 解决方案 > 根据返回查询映射两个相同的模型

问题描述

我有两张表ExportCSVExportCSV2每 30 分钟更新一次。它们是相同的。

public class ExportCSV
{

    [Key]
    public int ID { get; set; }

    public int ClientId { get; set; }
    public string LinkedInId { get; set; }
    public string SNUrl { get; set; }
    public string Fullname { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Organization1 { get; set; }
    public string JobTitle { get; set; }
    public string ExperienceDescr { get; set; }
    ...

}

    public class ExportCSV2
{

    [Key]
    public int ID { get; set; }

    public int ClientId { get; set; }
    public string LinkedInId { get; set; }
    public string SNUrl { get; set; }
    public string Fullname { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Organization1 { get; set; }
    public string JobTitle { get; set; }
    public string ExperienceDescr { get; set; }
    ...

}

根据最后更新的表,我在服务层中选择数据。

 public IQueryable GetExportByClientId(ref string tablename, int ClientId, DateTime? dateFrom, DateTime? dateTo)
    {
        var table = dataContext.GeneralSettings.FirstOrDefault(x => x.Key == "ActiveTableFullExport");
        if (table != null)
        {
            tablename = table.Value;

            if (table.Value.Equals("ExportCSV"))
            {
                if (dateFrom == null || dateTo == null)
                    return dataContext.ExportCSV.Where(x => x.ClientId == ClientId);
                else
                    return dataContext.ExportCSV.Where(x => x.ClientId == ClientId && x.StartDate > dateFrom && x.StartDate < dateTo);
            }
            else
            {
                if (dateFrom == null || dateTo == null)
                    return dataContext.ExportCSV2.Where(x => x.ClientId == ClientId);
                else
                    return dataContext.ExportCSV2.Where(x => x.ClientId == ClientId && x.StartDate > dateFrom && x.StartDate < dateTo);
            }
        }

        return null;
    }

当查询返回时出现问题ExportCSV2 在这种情况下,我得到一个异常

System.ArgumentException: 'DbOfTypeExpression requires an expression argument with a polymorphic result type that is compatible with the type argument.'


 public ActionResult GenerateCsvReportByClient(int clientId, DateTime? dateFrom , DateTime? dateTo)
    {

        var query = _fanService.GetExportByClientId(ref tableName ,clientId, dateFrom, dateTo);

        var data = query.OfType<ExportCSV>().ToList();

var fans = data.Select(x => new ExportCSViewModel
            {
                LinkedInId = x.LinkedInId,
                SNUrl = x.SNUrl,
                Fullname = x.Fullname,
                Firstname = x.Firstname,
                Lastname =x.Lastname,
                Organization1 = x.Organization1,
                JobTitle = x.JobTitle,
   }).ToList();

如何在这两种情况下映射视图模型,而不依赖于模型的类型?

标签: c#entity-frameworklinqmapping

解决方案


我认为您需要返回一个通用的 IQueryable,在这种情况下,一个IQueryable<ExportCSV>.

为此,您需要将 ExportCSV2 集合转换为 ExportCSV 集合:

public IQueryable<ExportCSV> GetExportByClientId(ref string tablename, int ClientId, DateTime? dateFrom, DateTime? dateTo)
    {
        Expression<Func<ExportCSV2, ExportCSV>> selector = x => new ExportCSV() {
            LinkedInId = x.LinkedInId,
            SNUrl = x.SNUrl,
            Fullname = x.Fullname,
            Firstname = x.Firstname,
            Lastname =x.Lastname,
            Organization1 = x.Organization1,
            JobTitle = x.JobTitle,
        }; 


        var table = dataContext.GeneralSettings.FirstOrDefault(x => x.Key == "ActiveTableFullExport");
    if (table != null)
    {
        tablename = table.Value;

        if (table.Value.Equals("ExportCSV"))
        {
            if (dateFrom == null || dateTo == null)
                return dataContext.ExportCSV.Where(x => x.ClientId == ClientId);
            else
                return dataContext.ExportCSV.Where(x => x.ClientId == ClientId && x.StartDate > dateFrom && x.StartDate < dateTo);
        }
        else
        {
            if (dateFrom == null || dateTo == null)
                return dataContext.ExportCSV2.Where(x => x.ClientId == ClientId)
                   .Select(selector);
            else
                return dataContext.ExportCSV2.Where(x => x.ClientId == ClientId && x.StartDate > dateFrom && x.StartDate < dateTo)
                   .Select(selector);
        }
    }

    return null;
}

然后你不需要这样做:var data = query.OfType<ExportCSV>().ToList();在你的控制器中,只需var data = query.ToList();

此外,您需要为所有字段编写选择器。我会为此使用 Automapper 库。


推荐阅读