c# - 根据返回查询映射两个相同的模型
问题描述
我有两张表ExportCSV
,ExportCSV2
每 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();
如何在这两种情况下映射视图模型,而不依赖于模型的类型?
解决方案
我认为您需要返回一个通用的 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 库。
推荐阅读
- groovy - Mule Anypoint Studio groovy.lang.MissingPropertyException:没有这样的属性:类的 StringEscapeUtils
- python - 该应用程序使用 UWSGI 和 Flask (tiangolo/uwsgi-nginx-flask) 在生产模式下运行两次
- postgresql - Postgres:带有时区的时间戳类型的无效输入语法:“”
- sql - 使用 SQL 汇总数据
- css - Web 配置和 IIS
- excel - Excel宏上的元素相乘
- typescript - 嵌入另一个泛型的 TypeScript 泛型
- c# - 可以在 ApiMember 属性和 xmldoc 摘要注释中使用相同的描述吗?
- vue.js - 制表符:在单元格焦点上加载编辑器参数
- android - 如何从输入法服务更改导航栏的颜色?