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

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

return (from o in myTable select o); 

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

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

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

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

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

如果需要在两个函数之间传递一组数据,最好的方法是创建一个包装数据的新类型或使用像TupleKeyValuePair这样的输入分组

这个怎么样?

我假设您的表’myTable’有一个实体类(我们称之为’MyTableEntity’),那么为什么不实例化一个新的MyTableEntity对象并使用对象初始化程序只填充您想要的那些列?

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

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

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

这对你有意义吗?

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

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

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

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

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

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