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