代码之家  ›  专栏  ›  技术社区  ›  BlueRaja - Danny Pflughoeft

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

  •  5
  • BlueRaja - Danny Pflughoeft  · 技术社区  · 15 年前

    我希望在使用LINQ(特别是LINQ to Entities)时实现MVC。我这样做的方法是让控制器使用LINQ生成(或调用生成)结果集,然后将其返回到视图以显示数据。问题是,如果我这样做的话:

    return (from o in myTable select o);
    

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

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

    因为没有办法使匿名类型安全!我确信在3.5节中没有一个好的、干净的方法可以做到这一点。( this 不干净……), 但是4.0呢?有什么计划,甚至提议吗? 如果没有像duck类型的linq,或者类型安全的匿名返回值(在我看来编译器当然应该能够做到),那么就几乎不可能将控制器与视图完全分离。

    6 回复  |  直到 11 年前
        1
  •  4
  •   Nick Larsen    15 年前

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

        2
  •  3
  •   JaredPar    15 年前

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

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

        3
  •  2
  •   empz    15 年前

    这个怎么样?

    我假设您有一个表“myTable”的实体类(我们称之为“myTableEntity”),那么为什么不实例化一个新的myTableEntity对象,并使用对象初始值设定项仅填充您想要的列呢?

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

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

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

    这对你有意义吗?

        4
  •  1
  •   BlueRaja - Danny Pflughoeft    15 年前

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

    事实证明,C 4.0支持duck输入——他们称之为 dynamic typing . 但是,在使用动态类型返回匿名类型时,我们会失去强类型的好处:

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

    我打开了一个功能请求,要求使用强类型匿名返回类型 here -如果您认为这是对C 5的一个有用的添加,请按照链接并让.NET团队知道!

        5
  •  0
  •   Community CDub    8 年前

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

        6
  •  0
  •   Faraz M. Khan    11 年前

    您可以轻松地将匿名类型转换为动态对象,下面是 Donymous 可以从匿名对象或数据读取器填充的对象(动态匿名对象)。