从 SQL 读取数据后立即将数据从 LINQ 转换为 SQL

Transforming data from LINQ-to-SQL as soon as they are read from SQL

我使用 LINQ-to-SQL 来提取和保存数据 from/to SQL 服务器。

假设我有一个众所周知的 Products table,它有一个名为 Description 的字段。该字段是自由文本,因此它可能包含换行符。为了避免 Windows/Unix 换行问题,我可能决定将“\r\n”替换为“\n”。但是,我想尽早执行此替换,最好是在从 SQL 服务器接收到数据时执行此替换。这样,myDataContext.Products 将 return Product 个描述仅包含“\n”的对象。

我该怎么做?

编辑

我知道我可以通过调用 Select() 来做到这一点。但是,每次使用 Products table 时,我都必须调用 Select()

让我通过显示一些代码来解释。我有一个 DataManager class 包装了 reading/writing 逻辑。它有一些像这样的方法:

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(将所有内容都写两次)。这就是为什么我正在寻找一种方法来包含转换 "inside" Products,以便仅调用 m_database.Products return 转换后的数据。

可能是这样的:

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

或者可能是自定义 getter...

public class Product
{
    private string _description;

    public int Id { get; set; }
    public string Description
    {
        get
        {
            return _description.Replace("\r\n", "\n");
        }
        set
        {
            _description = value;
        }
    }
}

我可能会扩展您使用的一些核心 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();