【问题标题】:Can an anonymous type be queried using LINQ? [duplicate]可以使用 LINQ 查询匿名类型吗? [复制]
【发布时间】:2016-07-14 13:01:56
【问题描述】:

我想使用 EF 从数据库中读取一些查找数据,所以我执行以下操作:

    public object LocationLookUps()
    {
        var locationTypes = ClientContext.LocationTypes;
        var serviceCategories = ClientContext.ServiceCategories;
        var serviceTypes = ClientContext.ServiceTypes;
        var timeZones = ClientContext.TimeZones;

        return new {locationTypes, serviceCategories, serviceTypes, timeZones};
    }

稍后,在我的消费代码中,我想查询这些类型中的每一个,以检查给定的 locationType、timeZone 等是否是有效值。如果我返回了List<LocationType>,那么我可以这样查询:

var locationType = list.SingleOrDefault(t => t.LocationTypeCode = "B");

你可以对匿名类型做同样的事情吗?

【问题讨论】:

  • 正如您在上述问题中看到的那样,您可以这样做,但我不建议这样做。刚刚创建了一个类,甚至使用了一个元组(可读性较差)。
  • 从方法返回新的匿名类型实例通常没有用处。一个例外是调用者使用完全相同的匿名类型的通用方法(如果属性完全相同,编译器会将其设为相同类型),但这是一种非常不寻常的情况。如果您需要从方法返回对象的新实例,通常您应该只声​​明一个新的命名类型。你为什么不想在这里做呢?我闻起来像XY Problem

标签: c# entity-framework linq anonymous-types


【解决方案1】:

没有办法从方法返回匿名类型,并且通过返回对象,您丢弃了类型信息的设计时知识。没有办法按照你的要求去做。

但这并不意味着没有办法做你想做的事。一些选项:

  • 分别以四种不同的方法返回每个查找
  • 创建一个 AllLookups 类,其中包括四个查找的类型化属性 并从方法中返回
  • 使用Repository Pattern 并公开用于特定查找相关查询的方法,每个查询都使用自己的方法

【讨论】:

    【解决方案2】:

    不,你不能。 C# 是强类型的。编译器在编译时查找所有匿名类型并将它们转换为真实类型。并且所有工作都使用匿名类型转换为使用此生成的真实类型。

    在您的代码中,您不知道未来的真实类型名称。所以你只能使用

    var temp = new {something};
    

    然后在不同的地方使用 temp localy 或通过反射(动态关键字)

    你返回对象。所以其他代码会像 Object 一样解释它。而且你不能制作演员表,因为你不知道名字。我想您必须创建一个包含四个字段的 ViewModel 类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多