我正在开发一个项目,我正在尝试使用实体框架向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?)
我已经追了好几天了,我无法绕过它正在寻找的东西。当我返回一个项目时,我运行了服务,但是对于项目,我需要返回一个列表。有人可以向我解释我做错了吗?
答案 0 :(得分: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 ,它 NOT 将可枚举实例强制转换为其他类型。
其次,Linq方法不会立即执行,它们会在您枚举可执行文件时执行。这意味着,当您开始枚举此方法的结果时,TP90Entities
已超出范围,方法将失败。并且在枚举之前,方法中的任何其他错误都不会出现。所以我调用ToArray()
来强制执行查询。
*假设您知道如何将vw_TP90Web
转换为vwTP90Web
答案 1 :(得分:1)
您不需要在演员阵容中加入IQueryable<T>
:
var tp90web = (from p
in context.vw_TP90Web
select p).Cast<vwTP90Web>();
请注意,如果查询未返回vwTP90Web
个实例,则在运行时仍会失败。