一旦从SQL读取数据,就将数据从LINQ-to转换为SQL

时间:2018-05-21 13:18:27

标签: c# linq-to-sql

我使用LINQ-to-SQL从/向SQL Server提取和保存数据。

假设我有一个众所周知的Products表,其中有一个名为Description的字段。该字段是自由文本,因此它可能包含换行符。为了避免Windows / Unix换行问题,我可能决定将“\ r \ n”替换为“\ n”。但是,我希望尽早执行此替换,理想情况下,从SQL Server接收数据时。这样,myDataContext.Products将返回其描述仅包含“\ n”的Product个对象。

我该怎么做?

修改

我知道我可以通过致电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是数据上下文,ProductsSystem.Data.Linq.Table。当然,我可以在每一行上调用Select(),但它会反对DRY(不要重复自己),实际上是WET(写一切两次)。这就是为什么我正在寻找一种方法来包含转换“内部”Products,以便只调用m_database.Products返回转换后的数据。

2 个答案:

答案 0 :(得分:2)

这样的事情可能是:

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;
        }
    }
}

答案 1 :(得分:1)

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