从 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();
我使用 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();