Performance Linq到SQL:投影、视图模型、不可翻译查询

Performance Linq到SQL:投影、视图模型、不可翻译查询,performance,linq-to-sql,model-view-controller,viewmodel,projection,Performance,Linq To Sql,Model View Controller,Viewmodel,Projection,我的应用程序必须处理大量数据,通常选择的大小约为10000行。为了提高性能,建议只选择所需的数据 当我必须进行计算或任何有意义的业务时,我很乐意选择所有数据,以便正确地实例化我的模型,以便依赖其功能 当只查看数据(通常在表中)时,这不是我想要的,我想将检索的数据量限制到绝对最小 到目前为止,我已经使用以下方法从我的存储库中获取数据(如下所示是在存储库中发挥所有魔力的方法: private IEnumerable<TResult> GetAllProject<TResult>

我的应用程序必须处理大量数据,通常选择的大小约为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();
}
private IEnumerable GetAllProject(表达式选择器、表达式谓词)
{
SetReadContext();
var query=DataContex.Table().Where(谓词).Select(选择器);
返回query.ToList();
}
这样,在调用存储库的方法中,我就有了annonymous类型的类型定义,并且我可以透明地处理那里的类型

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

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

我的问题是:

  • 到目前为止,我一直避免创建ViewModel,因为我害怕类型爆炸。实现它们的最佳方法是什么?我是否应该让选择器为我进行投影
  • 我是否应该编写不检查任何内容的单元测试,除非查询执行时没有异常

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


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

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


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

    那么我应该将我的ViewModel放在哪里?我想将它们分开ate,但是我需要在我的DataAccess层中引用它们,以便在那里定义选择器。或者我应该在其他地方定义选择器并单独测试它们吗?鉴于您的ViewModel是一个纯粹为了服务视图而进行的数据转换/简化,那么它就属于它的视图(或附近)。选择器只是ViewModel代码的一部分,应该像测试任何其他代码一样进行测试(不考虑语言或语法)。那么,我应该将ViewModel放在哪里?我想将它们分开,但是我需要在我的DataAccess层中引用它们,以便在那里定义选择器。或者我应该在其他地方定义选择器并单独测试它们吗?鉴于您的ViewModel是一个纯粹为视图服务的数据转换/缩减,那么它就属于它的View(或close by)。选择器只是ViewModel代码的一部分,应该像测试任何其他代码一样进行测试(无论语言或语法如何)。