Преобразование данных из LINQ-to-SQL, как только они будут прочитаны из SQL - PullRequest
0 голосов
/ 21 мая 2018

Я использую LINQ-to-SQL для извлечения и сохранения данных с / на SQL Server.

Предположим, у меня есть пресловутая таблица Products, в которой есть поле с именем Description.Поле является свободным текстом и может содержать новые строки.Чтобы избежать проблем с новой строкой в ​​Windows / Unix, я могу решить заменить "\ r \ n" на "\ n".Тем не менее, я хочу выполнить эту замену как можно раньше, в идеале именно так, как данные получены от SQL Server.Таким образом, myDataContext.Products вернет Product объектов, описание которых содержит только \ n.

Как я могу это сделать?

РЕДАКТИРОВАТЬ

Я знаю, что могу сделать это, позвонив Select().Тем не менее, я должен был бы вызывать Select() каждый раз, когда я использую таблицу Products.

Позвольте мне объяснить, показывая некоторый код.У меня есть DataManager класс, который оборачивает логику чтения / записи.У него есть несколько методов, подобных этим:

public Product GetProduct(int i_id)
{
    return m_database.Products.Where(p => p.Id == i_id).FirstOrDefault();
}

public Product GetProductByName(string i_name)
{
    return m_database.Products.Where(p => p.Name == i_name).FirstOrDefault();
}

Здесь m_database - это контекст данных, а Products - это System.Data.Linq.Table.Конечно, я мог бы позвонить Select() в каждой из этих строк, но это было бы против DRY (не повторяй себя), и на самом деле было бы WET (напиши все дважды).Вот почему я ищу способ включить преобразование «внутрь» Products, чтобы простой вызов m_database.Products вернул преобразованные данные.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я бы, вероятно, расширил некоторые основные функции Linq, которые вы используете.

Пример:

public static class ProductQueryExtensions
{
    public static List<Product> CleanSelect(this IQueryable<Product> q)
    {
        return q.Select(p => new Product 
        { 
            Id = p.Id,
            Description = p.Description.Replace("\r\n", "\n")
        }).ToList();
    }

    public static Product CleanFirstOrDefault(this IQueryable<Product> q)
    {
        return q.CleanSelect().FirstOrDefault();
    }
}

Тогда ваш пример кода станет:

return m_database.Products.Where(p => p.Id == i_id).CleanFirstOrDefault();
0 голосов
/ 21 мая 2018

Примерно так:

products.Select(p => new Product 
                     { 
                         Id = p.Id,
                         Description = p.Description.Replace("\r\n", "\n")
                     });

Или, возможно, пользовательский метод получения ...

public class Product
{
    private string _description;

    public int Id { get; set; }
    public string Description
    {
        get
        {
            return _description.Replace("\r\n", "\n");
        }
        set
        {
            _description = value;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...