【发布时间】:2015-11-19 14:07:46
【问题描述】:
我们必须为我们的许多表使用数据传输对象,因为它们非常大,而且许多列对我正在工作的上下文没有用处。
为了获得最佳性能,我无法读取完整的数据库实体并将其转换为 dtos。因此,我创建了一个 linq 扩展方法,在执行查询之前将其转换为 dtos。
调用扩展方法:
db.MyTable.Select(...).ToDto().ToList();
我的扩展方法:
public static IQueryable<MyTableDTO> ToDto(this IQueryable<MyTable> query)
{
return query.Select(x => new MyTableDTO
{
ID = x.ID,
Name = x.Name
});
}
这是一个可行的解决方案还是有更好的做法来做到这一点?
第二个问题:不仅有 IQueryable
public static MyTableDto ToDto (this MyTable x)
{
return new MyTableDto
{
ID = x.ID,
Name = x.Name
};
}
为什么我不能在我的第一个 ToDto 函数中使用这个函数? 喜欢:
public static IQueryable<MyTableDTO> ToDto(this IQueryable<MyTable> query)
{
return query.Select(x => x.ToDto());
}
更新
由于以下研究,还有一个问题。在某些情况下,我们只想返回最少的字段来解决高性能问题。
可以创建一个存储库类,您可以在其中定义一个参数来传递一个带有查询应该返回的字段的 Func(如下所述)。然后可以创建一个类(在下面的示例中为 MyServiceClass),您可以在其中为不同的返回实体调用相同的存储库方法。但这是一个好的做法还是更好的解决方案?
public class MyTableRepository<T>
{
public List<T> GetMyTable(String search1, String search2, Func<MyTable, T> selectExp)
{
using(var db = new Context())
{
return db.MyTable.Where(x => x.A == search1 ...).Select(selectExp).ToList();
}
}
}
public class MyServiceClass
{
public List<MyTableEntitySimple> GetMyTableEntitySimple(String search1...)
{
MyTableRepository<MyTableEntitySimple> rep = new ...
return rep.GetMyTable(search1, ToMyTableEntitySimple);
}
public List<MyTableEntity> GetMyTableEntity(String search1...)
{
MyTableRepository<MyTableEntity> rep = new ...
return rep.GetMyTable(search1, ToMyTableEntity);
}
Func<MyTable, MyTableEntitySimple) ToMyTableEntitySimple = x => new MyTableEntitySimple
{
ID = x.ID,
Name = x.Name
};
Func<MyTable, MyTableEntity) ToMyTableEntity = x => new MyTableEntitySimple
{
ID = x.ID,
Name = x.Name,
Field3 = x.Field3,
Field4 = x.Field4,
...
};
}
【问题讨论】:
-
1.这是可行的,您可以利用许多可用的库来避免需要手动映射属性。看看nuget.org/packages/AutoMapper 或nuget.org/packages/Mapster 2。不太清楚为什么不能,你看到什么错误?
-
您可以避免所有这些,只需使用 .Select(x => new MyTableDto { ID = x.ID, Name = x.Name }),直到您使用 ToList( ) 您仍然只处理查询并对那些字段进行选择,而不是全部。
-
timothy:谢谢,请参阅下面的答案... Stephen:问题是,我不想在返回实体的每种方法中都这样做。我希望每个实体只进行一次转换。
标签: c# entity-framework linq dto