【问题标题】:Linq to SQL: Projections, ViewModels, non translatable queriesLinq to SQL:Projections、ViewModels、不可翻译的查询
【发布时间】:2009-09-11 10:42:11
【问题描述】:

我的应用程序必须处理大量数据,通常选择大小约为 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,因为它会根据选择器计算出来。

现在的问题是,我无法控制传递给我的存储库的选择器。它还可能包含不可翻译的方法调用等。

我的问题是:

  1. 到目前为止,我一直避免创建 ViewModel,因为我害怕类型爆炸。实施它们的最佳方法是什么?我应该提供选择器来为我进行投影吗?
  2. 我是否应该编写除了查询无异常执行之外什么都不检查的单元测试?

【问题讨论】:

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


    【解决方案1】:

    我建议您创建 ViewModels,这样您就可以使用一组已知的类,类型爆炸并不是一个真正的问题,因为您目前正在使用匿名类型,这可能有点难以管理。

    如果您(通常)每个 View 有一个 ViewModel,那么它就会变得相当干净。在某些情况下,您甚至可以共享您的 ViewModel,尽管我建议您不要这样做,因为迟早会有一个消费者最终需要更多数据/字段,而另一个最终会得到一个臃肿的 ViewModel。

    【讨论】:

    • 那我应该把 ViewModel 放在哪里?我想让它们分开,但是我需要在我的 dataAcess 层中引用它们以便在那里定义选择器。或者我应该在别处定义选择器并单独测试它们?
    • 鉴于您的 ViewModel 是纯粹为视图服务而进行的数据转换/缩减,那么它属于它的视图(或附近)。选择器只是 ViewModel 代码的一部分,应该像测试任何其他代码一样进行测试(无论语言或语法如何)。
    猜你喜欢
    • 2021-06-23
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多