Search code examples
c#.netwcf-data-services

What is the implementing class for IGrouping?


I am trying create a WCF Data Services ServiceOperation that does grouping on the server side and then sends the data down to the client.

When I try to call it (or even connect to the service) I get an error. It says that it can't construct an interface.

The only interface I am using is IGrouping.

What is a/the actual class for this interface?


Update:

I checked the type while debugging a sample app and it told me it was:

System.Linq.Lookup<TKey,TElement>.Grouping

But what assembly is it in?


Solution

  • Several types in the BCL implement IGrouping, however they are all internal and cannot be accessed except by the IGrouping interface.

    But an IGrouping is merely an IEnumerable<TElement> with an associated key. You can easily implement an IGrouping that is backed by a List<TElement> and that should not be hard to serialize across a call boundary:

    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(); }
    
    }
    

    After applying the GroupBy operator you can create a list of Grouping instances:

    var listOfGroups =
      source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList();