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?)

私はこれを何日も追いかけてきましたが、探しているものに頭を包むことができません。1つのアイテムを返品したときにサービスを実行していましたが、プロジェクトの場合はリストを返す必要があります。誰かが私が間違っていることを私に説明できますか?

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_TP90Web*に変換する方法を知っていると仮定しますvwTP90Web

于 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 に答える