サーバー側でグループ化を行い、データをクライアントに送信するWCF Data ServicesServiceOperationを作成しようとしています。
電話をかけようとすると(またはサービスに接続しようとすると)、エラーが発生します。インターフェースを構築できないとのことです。
私が使用している唯一のインターフェースはIGroupingです。
このインターフェースの実際のクラスは何ですか?
更新:
サンプルアプリのデバッグ中にタイプを確認したところ、次のように表示されました。
System.Linq.Lookup<TKey,TElement>.Grouping
しかし、それはどの議会にありますか?
BCLのいくつかのタイプはIGrouping
を実装しますが、それらはすべて内部であり、IGrouping
インターフェース以外ではアクセスできません。
ただし、IGrouping
は、関連付けられたキーを持つIEnumerable<TElement>
にすぎません。 List<TElement>
に裏打ちされたIGrouping
を簡単に実装でき、呼び出しの境界を越えてシリアル化するのは難しくありません。
public class Grouping<TKey, TElement> : IGrouping<TKey, TElement> {
readonly List<TElement> elements;
public Grouping(IGrouping<TKey, TElement> grouping) {
if (grouping == null)
throw new ArgumentNullException("grouping");
Key = grouping.Key;
elements = grouping.ToList();
}
public TKey Key { get; private set; }
public IEnumerator<TElement> GetEnumerator() {
return this.elements.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
GroupBy
演算子を適用した後、Grouping
インスタンスのリストを作成できます。
var listOfGroups =
source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList();
これはおそらく、IGroupingの最も基本的で一般的な実装です。そのコンストラクターは、キーと値のセットを取ります。
public class Grouping<TKey, TElement> : IGrouping<TKey, TElement>
{
private readonly TKey key;
private readonly IEnumerable<TElement> values;
public Grouping(TKey key, IEnumerable<TElement> values)
{
if (values == null)
throw new ArgumentNullException("values");
this.key = key;
this.values = values;
}
public TKey Key
{
get { return key; }
}
public IEnumerator<TElement> GetEnumerator()
{
return values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
サンプルアプリでタイプを確認したところ、
System.Linq.Lookup<TKey,TElement>.Grouping
です。しかし、それはどの議会にありますか?
System.Linq.Lookup<TKey,TElement>
にネストされたタイプです。 System.Core
アセンブリの内部。
var groupingType = "1".GroupBy(x => x).Single().GetType().GetGenericTypeDefinition();
Console.WriteLine("Type: " + groupingType);
Console.WriteLine("Public: " + groupingType.IsPublic);
Console.WriteLine("Assembly: " + groupingType.Assembly);
出力:
Type: System.Linq.Lookup`2+Grouping[TKey,TElement]
Public: False
Assembly: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
.NET 4.0の時点では、コア.NETFrameworkにSystem.Linq.IGrouping<TKey,TElement>
を実装するパブリックタイプはありません。そのようなタイプが必要な場合(たとえば、シリアル化可能)、残念ながら、おそらく自分でロールする必要があります。