1

私はC#が初めてで、次のことにこだわっています。LINQ を使用して ADO.NET エンティティ オブジェクトをクエリする Silverlight Web サービスがあります。例えば:

[OperationContract]
public List<Customer> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select rec;
        return data.ToList();
    }
}

これは問題なく動作しますが、私がやりたいのは、これをより抽象化することです。最初のステップは a を返すことList<EntityObject>ですが、これによりコンパイラ エラーが発生します。たとえば、次のようになります。

[OperationContract]
public List<EntityObject> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select rec;
        return data.ToList();
    }
}

エラーは次のとおりです。

Error 1 Cannot implicitly convert type 'System.Collections.Generic.List<SilverlightTest.Web.Customer>' to 'System.Collections.Generic.IEnumerable<System.Data.Objects.DataClasses.EntityObject>'. An explicit conversion exists (are you missing a cast?)

私は何を間違っていますか?

ありがとう、

AJ

4

5 に答える 5

3

Customerはから継承されますが、 からは継承さEntityObjectList<Customer>ませんList<EntityObject>。これは、ジェネリック型の共分散がサポートされていないためです (C# 4.0 では、インターフェイスでは共分散がサポートされていますが、 ではサポートされていませんIList<T>)。

List<Customer>タイプ の変数にa を割り当てることができれば、次のList<EntityObject>ようなことができます。

List<EntityObject> list = new List<Customer>();
list.Add(new Product()); // assuming Product inherits from EntityObject

Productこのコードは明らかに壊れています。a に aを追加することはできませんList<Customer>。だから許されない

于 2010-03-29T12:06:28.537 に答える
0

を超えてdata.Cast<EntityObject>().ToList();、おそらく派生型を既知の型として定義する必要があるため、WCF は派生オブジェクトをシリアル化する方法を認識します。

http://msdn.microsoft.com/en-us/library/ms730167.aspx

于 2010-03-29T13:20:26.580 に答える
0
[OperationContract]
public List<EntityObject> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select (EntityObject)rec;
        return data.ToList();
    }
}

D が B から派生した場合でも、List を List にキャストすることはできません。これは共分散と呼ばれ、配列でのみ機能します。C# 4.0 で完全に導入されます。

于 2010-03-29T12:06:39.373 に答える
0

var データには Customer オブジェクトが含まれ、戻り値は EntityObjects のリストです。

それらをキャストする必要があります:

data.ConvertAll(obj => (EntityObject) obj).ToList();
于 2010-03-29T12:07:11.560 に答える
0

あなたができる

data.Cast<EntityObject>().ToList();
于 2010-03-29T12:22:05.150 に答える