0

我有一个从表中检索三列的查询 - 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 也始终为空。

有几个我不喜欢的潜在解决方案。

  1. 使属性名称与列名称相同。例如,Record1 类将具有属性 ID、EMAIL_ID_NUMBER 和 MESSAGE_SUBJECT。
  2. 在查询中使用列别名来匹配属性名称。例如,使用查询“从 EMAIL_NOTIFICATIONS 中选择 ID、EMAIL_ID_NUMBER 名称、MESSAGE_SUBJECT MessageSubject”和 Record1 属性名称 ID、Name 和 MessageSubject。
4

0 回答 0