c# - Linq to Sql : Optimizing lamba expression - clean code

标签 c# asp.net linq

我有这个表达式,它生成对数据库的单个查询:

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/

相关文章:

c# - 合并参数和 IList<T> 构造函数

c# - 将信息记录到 azure webjobs 日志文件中?

asp.net - 网站创建两个资源

c# - 通过linq中的where子句选择全部

.net - 在选择部分中使用子选择的 Linq to Entities

c# - LINQ GroupBy x 其中有多个 x 并且 y 是唯一的

c# - .Net Socket 增强以支持 ACK 和聊天?

c# - 看似有效的 JSON Blob 的 JSON.NET 反序列化失败

c# - ASP.NET - MySQL 批量插入每行异步响应

c# - 将值从代码隐藏传递到 Javascript