Linq to SQL:Projections,ViewModels,不可翻译的查询

时间:2009-09-11 10:42:11

标签: performance linq-to-sql model-view-controller viewmodel projection

我的应用程序必须处理大量数据,通常选择大小约为10000行。为了提高性能,建议仅选择所需的数据。

当我必须进行计算或任何有意义的业务时,我很乐意选择所有数据以便正确地实例化我的模型,所以我可以依赖它的功能。

当只查看数据时(通常在表格中)这不是我想要的,我想将检索到的数据量限制在绝对最小值。

到目前为止,我已经使用以下方法从我的存储库中获取数据(如下所示是在存储库中执行所有魔法的方法:

private IEnumerable<TResult> GetAllProject<TResult>(Expression<Func<T, TResult>> selector, Expression<Func<T, bool>> predicate)
{
    SetReadContext();
    var query = DataContex.Table<Order>().Where(predicate).Select(selector);

    return query.ToList();
}

这样我在调用存储库的方法中有了匿名类型的类型定义,我可以透明地使用那里的类型。

每个控制器都可以准确定义要传递给视图的数据,它非常高效,因为我可以直接影响列排序等,而无需在视图中处理网格控件来为我这样做。我在DataContext上不需要任何LoadOptions,因为它根据选择器计算出来。

现在的问题是,我没有控制传递给我的Repository的选择器。它也可能包含不可翻译的方法调用等。

我的问题是:

  1. 到目前为止,我已经避免创建ViewModels,因为我担心类型爆炸。实施它们的最佳方法是什么?我应该选择哪种选择器来为我做投影吗?
  2. 我应该编写单元测试,除了查询执行情况外,什么都不检查?

1 个答案:

答案 0 :(得分:1)

我建议你创建ViewModel,这样你就可以使用一组已知的类,Type Explosion并不是真正的问题,因为你现在正在使用匿名类型,这可能有点难以管理。 / p>

如果您(通常)每个View都有一个ViewModel,那么它会变得非常干净。在某些情况下,你甚至可以共享你的ViewModel,虽然我建议不要使用它,因为其中一个消费者迟早需要更多的数据/字段,而另一个最终需要一个膨胀的ViewModel。