我有一个从表中检索三列的查询 - ID、EMAIL_ID_NUMBER 和 MESSAGE_SUBJECT。我想将这三列映射到对象 ID、EMAIL_ID_NUMBER 和 MessageSubject 的属性(选择名称以突出问题)。问题是映射没有按我的预期工作。
我希望当我在某个属性旁边指定 Column(Name = "COLUMN1") 时,COLUMN1 的值将存储到该属性中。但是,它不起作用。仅当属性名称与列名称完全相同时才存储该值。例如在这种情况下...
[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;
...我希望查询中的 MESSAGE_SUBJECT 列将填充 MessageSubject 属性。然而,这并没有发生。问题是我该怎么做?
其他属性的填充没有问题,因为它们的名称与查询中列的名称相同。
代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Text;
using System.Threading.Tasks;
namespace LinqExample1
{
class Record1
{
[Column(CanBeNull = false, IsPrimaryKey = true)]
public int ID;
[Column()]
public String EMAIL_ID_NUMBER;
[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;
public override string ToString()
{
return $"{base.ToString()}. ID={ID}. Name={EMAIL_ID_NUMBER}. MessageSubject={MessageSubject}";
}
}
class Program
{
static void Main(string[] args)
{
var context = new DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["LinqExample1.Properties.Settings.MyConnectionString"].ToString());
var emailTemplates = context.ExecuteQuery<Record1>("select ID, EMAIL_ID_NUMBER, MESSAGE_SUBJECT from EMAIL_NOTIFICATIONS");
foreach (Record1 emailTemplate in emailTemplates)
{
Console.WriteLine(emailTemplate.ToString());
}
}
}
}
我得到的输出如下所示:
LinqExample1.Record1. ID=4. Name=EM 05. MessageSubject=
LinqExample1.Record1. ID=16. Name=EM 06. MessageSubject=
LinqExample1.Record1. ID=17. Name=EM 07. MessageSubject=
例如,即使底层查询返回 MESSAGE_SUBJECT 列的数据,MessageSubject 也始终为空。
有几个我不喜欢的潜在解决方案。
- 使属性名称与列名称相同。例如,Record1 类将具有属性 ID、EMAIL_ID_NUMBER 和 MESSAGE_SUBJECT。
- 在查询中使用列别名来匹配属性名称。例如,使用查询“从 EMAIL_NOTIFICATIONS 中选择 ID、EMAIL_ID_NUMBER 名称、MESSAGE_SUBJECT MessageSubject”和 Record1 属性名称 ID、Name 和 MessageSubject。