Using LinqExtender to make OData feed fails

Posted by BurningIce on Stack Overflow See other posts from Stack Overflow or by BurningIce
Published on 2010-05-10T03:59:46Z Indexed on 2010/05/10 4:08 UTC
Read the original article Hit count: 328

Filed under:
|
|
|

A pretty simple question, has anyone here tried to make a OData feed based on a IQueryable created with LinqExtender?

I have created a simple Linq-provider that supports Where, Select, OrderBy and Take and wanted to expose it as an OData Feed. I keep getting an error though, and the Exception is a NullReference with the following StackTrace

at System.Data.Services.Serializers.Serializer.GetObjectKey(Object resource, IDataServiceProvider provider, String containerName)
at System.Data.Services.Serializers.Serializer.GetUri(Object resource, IDataServiceProvider provider, ResourceContainer container, Uri absoluteServiceUri)
at System.Data.Services.Serializers.SyndicationSerializer.WriteEntryElement(IExpandedResult expanded, Object element, Type expectedType, Uri absoluteUri, String relativeUri, SyndicationItem target)
at System.Data.Services.Serializers.SyndicationSerializer.<DeferredFeedItems>d__0.MoveNext()
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteItems(XmlWriter writer, IEnumerable`1 items, Uri feedBaseUri)
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteFeedTo(XmlWriter writer, SyndicationFeed feed, Boolean isSourceFeed)
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteFeed(XmlWriter writer)
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteTo(XmlWriter writer)
at System.Data.Services.Serializers.SyndicationSerializer.WriteTopLevelElements(IExpandedResult expanded, IEnumerator elements, Boolean hasMoved)
at System.Data.Services.Serializers.Serializer.WriteRequest(IEnumerator queryResults, Boolean hasMoved)
at System.Data.Services.ResponseBodyWriter.Write(Stream stream)

I've kinda narrowed it down to a issue where LinqExtender wraps every returned object, so that my object actually inherits itself - thats at least how it looks like in the debugger.

These two queries are basicly the same. The first is the legacy-api where the OrderBy and Select is regular Linq to Objects. The second query is a "real" linq-provider made with LinqExtender.

var db = CalendarDataProvider.GetCalendarEntriesByDate(DateTime.Now, DateTime.Now.AddMonths(1), Guid.Empty)
   .OrderBy(o => o.Title)
   .Select(o => new ODataCalendarEntry(o));

var query = new ODataCalendarEntryQuery()
   .Where(o => o.Start > DateTime.Now && o.End < DateTime.Now.AddMonths(1))
   .OrderBy(o => o.Title);

When returning db for the OData feed everything is fine, but returning query throws a NullRefenceException.

I've tried all kind of tricks and even tried to project all the data into a new object like this, but still the same error

 return query.Select(o => new ODataCalendarEntry
        {
            Title = o.Title,
            Start = o.Start,
            End = o.End,
            Name = o.Name
        });

© Stack Overflow or respective owner

Related posts about LINQ

Related posts about OData