【问题标题】:cannot implicitly convert type 'System.Linq.IQueryable' to 'System.Linq.IQueryable'无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”
【发布时间】:2013-01-29 20:03:29
【问题描述】:

我正在从事一个项目,我正在尝试使用实体框架向 WCF 服务提供数据。代码如下:

public IQueryable<vwTP90Web> GetTP90()
    {
            TP90Entities context = new TP90Entities();
            var tp90web = (from p
                          in context.vw_TP90Web
                          select p).Cast<IQueryable<vwTP90Web>>();
            return tp90web;

    }

它工作正常,直到我尝试返回数据然后我收到消息:

Cannot implicitly convert type        
'System.Linq.IQueryable<System.Linq.IQueryable<TP90Service.vwTP90Web>>' to 
'System.Linq.IQueryable<TP90Service.vwTP90Web>'. An explicit conversion exists (are   
 you missing a cast?)

我已经追了好几天了,但我无法理解它在寻找什么。当我返回一个项目时,我的服务正在运行,但对于该项目,我需要返回一个列表。有人可以向我解释我做错了什么吗?

【问题讨论】:

    标签: linq wcf entity-framework error-handling implicit-conversion


    【解决方案1】:

    看起来应该可以正常工作*

    public IEnumerable<vwTP90Web> GetTP90()
    {
        var context = new TP90Entities();
        return (from p
               in context.vw_TP90Web
               select Convert(p)).ToArray();
    }
    
    private TP90Service.vwTP90Web Convert(P90MVC.DomainEntity.Models.vw_TP90Web source)
    {
        vwTP90Web result = null;
        // I don't know how to convert vw_TP90Web types to vwTP90Web types
        // Nobody here can do this for you
        // So you will have to fill in the code here.
        return result;
    }
    

    您必须了解这里发生的一些事情。

    首先,Cast&lt;T&gt;() 方法将可枚举中的每个元素转换为 T,它确实不将可枚举实例转换为不同的类型。

    其次,Linq 方法不会立即执行,它们会在您触发可枚举时执行。这意味着,当您开始枚举此方法的结果时,TP90Entities 已超出范围,该方法将失败。并且在您枚举之前,该方法中的任何其他错误都不会出现。所以我打电话给ToArray() 来强制执行查询。

    * 假设您知道如何将vw_TP90Web 转换为vwTP90Web

    【讨论】:

    • ToList() 也被广泛使用,但你明白了,+1
    • @MareInfinitus:我通常使用数组,因为它的性能很好。至少我相信它是。我也相信“性能”是一个词。
    • 我仍然收到包含两个建议答案的错误消息。消息如下。无法将类型“TP90MVC.DomainEntity.Models.vw_TP90Web[]”隐式转换为“System.Collections.Generic.IEnumerable”,是的,vwTP90Web 是我的界面中描述的列的集合。
    • 这里没有工作室可以自己尝试,但是select new 应该可以解决问题(创建您需要的实例)
    • @Mykal73:您必须知道您正在尝试将一种类型转换为另一种类型。这是非常基本的东西,你需要知道它是如何工作的才能达到这一点。由于没有人知道这两种不同类型中有什么,我们无法告诉您如何在两者之间来回映射。如果您无法弄清楚,您可能需要退后一步,做一些阅读,或与您的一些同事交谈。
    【解决方案2】:

    您无需在演员表中加入IQueryable&lt;T&gt;:

           var tp90web = (from p
                          in context.vw_TP90Web
                          select p).Cast<vwTP90Web>();
    

    请注意,如果查询未返回 vwTP90Web 实例,这仍然会在运行时失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多