1

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

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

4

2 回答 2

3

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

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>()方法将可枚举中的每个元素转换为 T,它不会可枚举实例转换为不同的类型。

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

* 假设您知道如何转换vw_TP90WebvwTP90Web

于 2013-01-29T20:09:41.813 回答
1

你不需要IQueryable<T>在你的演员表中加入:

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

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

于 2013-01-29T20:07:57.280 回答