返回匿名类型的简单方法(使用LINQ使MVC成为可能)

时间:2010-03-15 21:13:51

标签: c# asp.net-mvc linq linq-to-sql linq-to-entities

我想在使用LINQ(特别是LINQ到实体)时实现MVC。我这样做的方法是让Controller使用LINQ生成(或调用生成的)结果集,然后将其返回到View以显示数据。问题是,如果我这样做:

return (from o in myTable select o);

所有列都是从数据库中读取的,即使是我不想要的列(可能是几十个)。而且 - 更重要的是 - 我不能做这样的事情:

return (from o in myTable select new { o.column });

因为没有办法让匿名类型安全!我知道确实没有好的,干净的方式在3.5中做到这一点(this不干净......),但4.0怎么样?是否有任何计划,甚至提议?没有类似于duck-typing-for-LINQ或类型安全的匿名返回值(在我看来编译器当然应该能够做到这一点),它似乎是几乎不可能将Controller与View完全分开。

6 个答案:

答案 0 :(得分:4)

使用视图模型图层。您的视图必须知道它将显示的内容。我想可以创建一个只是格式化多维数据数组的视图,但这并不是使用MVC解决方案的最佳理由。但是,您可以使用匿名对象填充视图模型,以供视图使用。

答案 1 :(得分:3)

匿名类型主要用于在方法中使用。它们不适合方法之间的通信。

如果您需要在两个函数之间传递一组数据,最好的方法是创建一个包装数据的新类型或使用失败者分组,如Tuple<T1,T2>KeyValuePair<TKey,TValue>

答案 2 :(得分:2)

这个怎么样?

我假设您的表'myTable'有一个实体类(我们称之为'MyTableEntity'),那么为什么不实例化一个新的MyTableEntity对象并使用对象初始化器来只填充你想要的那些列呢? / p>

return (from o in myTable select new MyTableEntity { AColumn = o.column });

这不会像您要求的那样转换为SELECT *,但您仍然可以将强类型对象传递给视图。

你必须小心地只使用视图中的初始化属性,就是这样。

这对你有意义吗?

答案 3 :(得分:1)

由于没有人试图回答我的问题,我会自己回答。

事实证明,C#4.0支持鸭子打字 - 他们称之为dynamic typing。但是,在使用动态类型返回匿名类型时,我们会失去强类型的好处:

  • 编译时类型检查
  • 性能
  • 智能感知

我已经打开了一个功能请求,要求强类型匿名返回类型here - 如果您认为这对C#5是一个有用的补充,请点击链接并让.Net团队知道!

答案 4 :(得分:0)

在.NET 4.0上,匿名类型可以很容易地转换为ExpandoObjects,因此所有问题都可以通过转换本身的开销来解决。 查看here

答案 5 :(得分:0)

您可以轻松地将匿名类型转换为动态对象,这里是可以从Anonymous对象或DataReader填充的Donymous对象(动态匿名对象)的简单实现。