Gro*_*fit 1 c# sql linq expression-trees linq-to-sql
我有一个问题,想知道是否有办法吃蛋糕并吃掉它.
目前我有一个存储库和查询样式模式,我如何使用Linq2Sql,但我有一个问题,我看不到一个很好的方法来解决它.以下是问题的示例:
var someDataMapper = new SomeDataMapper();
var someDataQuery = new GetSomeDataQuery();
var results = SomeRepository.HybridQuery(someDataQuery)
.Where(x => x.SomeColumn == 1 || x.SomeColumn == 2)
.OrderByDescending(x => x.SomeOtherColumn)
.Select(x => someDataMapper.Map(x));
return results.Where(x => x.SomeMappedColumn == "SomeType");
Run Code Online (Sandbox Code Playgroud)
这里要注意的主要部分是Mapper,Query,Repository,然后是最后的where子句.我这样做是作为一个更大的重构的一部分,我们发现有很多类似的查询得到稍微不同的结果集,但然后将它们以相同的方式映射到特定于域的模型.因此,例如,取回a tbl_car然后将其映射到Car对象.因此,映射器基本上采用一种类型并吐出另一种类型,因此与选择中通常发生的情况完全相同:
// Non mapped version
select(x => new Car
{
Id = x.Id,
Name = x.Name,
Owner = x.FirstName + x.Surname
});
// Mapped version
select(x => carMapper.Map(x));
Run Code Online (Sandbox Code Playgroud)
因此,汽车映射器在所有区域上都可以重复使用,这些区域执行类似的查询,返回相同的最终结果,但在此过程中执行不同的位.但是我一直得到错误,说Map无法转换为SQL,这很好,因为我不希望它,但是我理解,因为它在表达式树中它会尝试转换它.
{"Method 'SomeData Map(SomeTable)' has no supported translation to SQL."}
Run Code Online (Sandbox Code Playgroud)
最后,返回并映射的对象在堆栈中进一步传递给其他对象使用,这使用Linq to SQL的组合能力为查询添加其他条件,然后最终ToList()或对返回的数据进行itterate,但是基于映射模型的过滤器,而不是原始的表模型,我认为这是完全正常的,如上一个问题所述:
总结一下,我可以使用我的映射模式,而不试图将单个部分转换为SQL吗?
是的你可以.放在AsEnumerable()最后一个Select:
var results = SomeRepository.HybridQuery(someDataQuery)
.Where(x => x.SomeColumn == 1 || x.SomeColumn == 2)
.OrderByDescending(x => x.SomeOtherColumn)
.AsEnumerable()
.Select(x => someDataMapper.Map(x));
Run Code Online (Sandbox Code Playgroud)
但请注意,第二个Where- 操作的SomeMappedColumn- 现在将在内存中执行,而不是由数据库执行.如果这最后一个where子句显着减少了结果集,那么这可能是个问题.
另一种方法是创建一个返回该映射的表达式树的方法.只要映射中发生的所有事情都可以转换为SQL,就可以使用以下内容.
Expression<Func<EntityType, Car>> GetCarMappingExpression()
{
return new Expression<Func<EntityType, Car>>(x => new Car
{
Id = x.Id,
Name = x.Name,
Owner = x.FirstName + x.Surname
});
}
Run Code Online (Sandbox Code Playgroud)
用法如下:
var results = SomeRepository.HybridQuery(someDataQuery)
.Where(x => x.SomeColumn == 1 || x.SomeColumn == 2)
.OrderByDescending(x => x.SomeOtherColumn)
.Select(GetCarMappingExpression());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |