无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”

无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”,linq,wcf,entity-framework,error-handling,implicit-conversion,Linq,Wcf,Entity Framework,Error Handling,Implicit Conversion,我正在从事一个项目,试图使用实体框架向WCF服务提供数据。守则如下: public IQueryable<vwTP90Web> GetTP90() { TP90Entities context = new TP90Entities(); var tp90web = (from p in context.vw_TP90Web s

我正在从事一个项目,试图使用实体框架向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?)

我已经追了好几天了,我就是不知道它在找什么。当我返回一个项目时,服务正在运行,但是对于这个项目,我需要返回一个列表。有人能解释一下我做错了什么吗?

你不需要在演员阵容中加入IQueryable:

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

请注意,如果查询未返回vwTP90Web实例,则此操作在运行时仍将失败。

您不需要在强制转换中包含IQueryable:

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

请注意,如果查询未返回vwTP90Web实例,则在运行时此操作仍将失败。

这似乎可以正常工作*

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方法将枚举中的每个元素强制转换为T,它不会将枚举实例强制转换为其他类型

其次,Linq方法不会立即执行,它们是在遍历可枚举对象时执行的。这意味着,当您开始枚举此方法的结果时,TP90Entities已超出范围,该方法将失败。并且在枚举之前,方法中的任何其他错误都不会出现。所以我调用ToArray是为了强制执行查询


*假设您知道如何将vw_TP90Web转换为vwTP90Web,那么这应该可以正常工作*

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方法将枚举中的每个元素强制转换为T,它不会将枚举实例强制转换为其他类型

其次,Linq方法不会立即执行,它们是在遍历可枚举对象时执行的。这意味着,当您开始枚举此方法的结果时,TP90Entities已超出范围,该方法将失败。并且在枚举之前,方法中的任何其他错误都不会出现。所以我调用ToArray是为了强制执行查询


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