Сопоставление столбца запроса со свойством с другим именем в LINQ.ColumnAttribute.Name не работает - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть запрос, который извлекает три столбца из таблицы - ID, EMAIL_ID_NUMBER и MESSAGE_SUBJECT.Я хочу сопоставить эти три столбца со свойствами идентификатора объекта, 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=

Например, MessageSubject всегда пуст, даже если базовый запрос возвращает данные для столбца MESSAGE_SUBJECT.

Существуетпара потенциальных решений, которые мне не нравятся.

  1. Сделайте имена свойств такими же, как имена столбцов.Например, класс Record1 будет иметь свойства ID, EMAIL_ID_NUMBER и MESSAGE_SUBJECT.
  2. Использовать псевдонимы столбцов в запросе для сопоставления имен свойств.Например, используйте запрос «выберите идентификатор, имя EMAIL_ID_NUMBER, MESSAGE_SUBJECT MessageSubject из EMAIL_NOTIFICATIONS» и имена свойств записи Record1, имя и имя сообщения.
...