C# 将IQueryable传递到ViewModel的错误做法

C# 将IQueryable传递到ViewModel的错误做法,c#,asp.net-mvc,C#,Asp.net Mvc,我可能对这里的ViewModels有些误解(我对它们不太熟悉),但将静态Get方法传递给IQueryable是否是一种不好的做法?我还没有尝试过这个,所以我不确定它是否有效,但这是一个关于ViewModels使用的更大问题 例如: using (var db = something.Invoke()) { var query = some query; var data = MyViewModel.Get(query); //pass an IQueryable //d

我可能对这里的ViewModels有些误解(我对它们不太熟悉),但将静态
Get
方法传递给
IQueryable
是否是一种不好的做法?我还没有尝试过这个,所以我不确定它是否有效,但这是一个关于ViewModels使用的更大问题

例如:

using (var db = something.Invoke()) {
    var query = some query;
    var data = MyViewModel.Get(query); //pass an IQueryable

    //do something with data
}

class MyViewModel {
    public List<int> Something {get; set;}

    public static MyViewModel Get(IQueryable data) {
        var view = new MyViewModel();
        var list = new List<int>();
        foreach (var d in data) {
            list.Add(d.Column);
        }
        view.Something = list;
        return view;
    }
}
使用(var db=something.Invoke()){
var query=一些查询;
var data=MyViewModel.Get(query);//传递IQueryable
//处理数据
}
类MyViewModel{
公共列表某物{get;set;}
公共静态MyViewModel获取(IQueryable数据){
var view=新的MyViewModel();
var list=新列表();
foreach(数据中的var d){
列表。添加(d列);
}
view.Something=列表;
返回视图;
}
}

必须将我的数据库映射到更通用的数据结构,然后将其传递到我的ViewModel以执行另一个映射(如数据库->列表->ViewModel),这似乎真的是多余的。如果我只需传入查询并在ViewModel中进行100%的映射,而不是在中间步骤(数据库->ViewModel)中进行映射,就更容易了。

我更喜欢让我的ViewModel相当干净,并且独立于它们的构造方式


在这种情况下,我会使用构建器或工厂模式来构建您的ViewModel,然后该构建器/工厂可以依赖您的数据库。

我更喜欢让我的ViewModel非常干净,并且独立于它们的构建方式


在这种情况下,我会使用构建器或工厂模式来构建您的ViewModel,然后该构建器/工厂可以获取对数据库的依赖。

我们已经尝试在ViewModels中使用逻辑,但这是一条疯狂的道路

ViewModels应该是POCO-only属性,没有(或非常基本的)逻辑。所有映射都应该在控制器中完成,甚至应该在控制器调用的
queryhandler
中完成。而
queryhandler
将依赖于数据库,并进行从数据库数据结构到视图模型所需的映射


ViewModel的职责是将数据从控制器传送到视图(或向后)。如果将DB或映射逻辑引入,这违反了单一责任原则。

我们曾尝试在ViewModels中使用逻辑,但这是一条疯狂之路

ViewModels应该是POCO-only属性,没有(或非常基本的)逻辑。所有映射都应该在控制器中完成,甚至应该在控制器调用的
queryhandler
中完成。而
queryhandler
将依赖于数据库,并进行从数据库数据结构到视图模型所需的映射


ViewModel的职责是将数据从控制器传送到视图(或向后)。如果将DB或映射逻辑引入,则违反了单一责任原则。

Hi。实际上我也开始考虑这个选择。一次又一次地创建非常相似的viewmodel变得非常麻烦,而且由于EF有一个IQueryable选项,所以让viewmodel构造函数自己创建对我来说几乎是有意义的。这就是“构造器”的意义所在。。。这真的违反了我们的原则吗?我想知道…嗨。实际上我也开始考虑这个选择。一次又一次地创建非常相似的viewmodel变得非常麻烦,而且由于EF有一个IQueryable选项,所以让viewmodel构造函数自己创建对我来说几乎是有意义的。这就是“构造器”的意义所在。。。这是否真的违反了我想知道的原则。。。