我有这个表达式,它生成对数据库的单个查询:
db = new MyDataContext();
var productInCity = db.Products
.Where(n => n.id == 2)
.Select(k => new ProductInCityDto()
{
ProductName = k.ProductName,
CityName = k.Store.City.Name,
CountryName = k.Store.City.Country.Name
.
.
.
})
.FirstOrDefault();
我想通过将映射放在函数、扩展方法或对象的构造函数中来使这段代码更清晰,如下所示:
db = new MyDataContext();
var productInCity = db.Products
.Where(n => n.id == 2)
.Select(k => new ProductInCityDto(k))
.FirstOrDefault();
但是,在这种情况下,会生成对数据库的多个查询(我使用 LinqToSql Profiler)。
有没有办法隔离映射(Select 语句)以实现更好的代码可读性?
最佳答案
是的,如果您查看 IQueryable 上 Select 扩展方法的实际签名,您会发现它不采用函数而是采用表达式>。
那么,就这样吧......
Expression<Func<Product, ProductInCityDto>> MyMappingExpression
{
get
{
return product => new ProductInCityDto
{
...
}
}
}
然后
db = new MyDataContext();
var productInCity = db.Products.Where(n => n.id == 2)
.Select(MyMappingExpression)
.FirstOrDefault();
如果您需要在进程中使用 MyMappingExpression,您可能希望将其转换为
Func<Product, ProductInCityDto>
通过调用 Expression.Compile() 方法。
关于c# - Linq to Sql : Optimizing lamba expression - clean code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15020595/