【问题标题】:Why can't I use a Linq query on a Visio Masters collection?为什么我不能对 Visio Masters 集合使用 Linq 查询?
【发布时间】:2009-07-29 02:56:10
【问题描述】:

我正在尝试对 Visio Masters 集合执行以下 Linq 查询:

List<string> allMasterNames = (from master in myStencil.Masters select master.NameU).ToList<string>

我收到以下错误:

找不到实现 源类型的查询模式 'Microsoft.Office.Interop.Visio.Masters'。 未找到“选择”。考虑 明确指定的类型 范围变量“主”。

当查询的对象未实现IEnumerable&lt;T&gt;IQueryable&lt;T&gt; 时,似乎会发生此错误。是这里的情况,还是其他原因?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    是的,那是因为它不是IEnumerable&lt;T&gt;IQueryable&lt;T&gt;,而且它没有编写自己的自定义Select方法。

    与流行相反,相信您不必必须实现这些接口才能获得 LINQ 支持,您只需要将它们编译成的方法即可。

    这很好:

    public class MyClass { 
      public MyClass Select<MyClass>(Func<MyClass, MyClass> func) { ... } 
    }
    
    var tmp = from m in new MyClass()
              select m;
    

    当然.ToList() 不会工作;)

    当您解决问题时,请尝试使用 Cast&lt;T&gt;() 扩展方法,这将使其成为 IEnumerable&lt;T&gt; 并允许您对自己的内心内容进行 LINQ。

    【讨论】:

    • 我添加了答案,当我这样做的时候,你得到了你需要的东西:)
    【解决方案2】:

    正如异常消息所暗示的,考虑明确指定范围变量“master”的类型。

    from Visio.Master master in myStencil.Masters select master.NameU
    

    【讨论】:

      【解决方案3】:

      根据Reflector...

      public class MastersClass : IVMasters, Masters, EMasters_Event, IEnumerable
      {
        // more
      }
      

      其他人都不是IEnumerable&lt;T&gt;。但是,好的 OL IEnumerable 就在那里,所以你可以为每个。

      【讨论】:

        【解决方案4】:

        我无法尝试这段代码。

        (from master in myStencil.Masters.Cast<Masters> select master.NameU).ToList<string>)
        

        要点是使用Enumerable.Cast 方法,将非泛型列表转换为泛型列表。
        这行得通吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-11
          • 1970-01-01
          • 2019-12-17
          • 2012-04-11
          • 2010-11-14
          相关资源
          最近更新 更多