I'll say up front that I am doing some really scary things with linq on dynamic data. But I can't figure out why this query fails to compile:
Error 1 The property '<>h__TransparentIdentifier0' cannot be used with type arguments
public class Program
{
public static void Main(string[] args)
{
var docs = new dynamic[0];
var q = from doc in docs
where doc["@metadata"]["Raven-Entity-Name"] == "Cases"
where doc.AssociatedEntities != null
from entity in doc.AssociatedEntities
where entity.Tags != null // COMPILER ERROR HERE
from tag in entity.Tags
where tag.ReferencedAggregate != null
select new {tag.ReferencedAggregate.Id, doc.__document_id};
}
}
public static class LinqOnDynamic
{
private static IEnumerable<dynamic> Select(this object self)
{
if (self == null)
yield break;
if (self is IEnumerable == false || self is string)
throw new InvalidOperationException("Attempted to enumerate over " + self.GetType().Name);
foreach (var item in ((IEnumerable) self))
{
yield return item;
}
}
public static IEnumerable<dynamic> SelectMany(this object source,
Func<dynamic, int, IEnumerable<dynamic>> collectionSelector,
Func<dynamic, dynamic, dynamic> resultSelector)
{
return Enumerable.SelectMany(Select(source), collectionSelector, resultSelector);
}
public static IEnumerable<dynamic> SelectMany(this object source,
Func<dynamic, IEnumerable<dynamic>> collectionSelector,
Func<dynamic, dynamic, dynamic> resultSelector)
{
return Enumerable.SelectMany(Select(source), collectionSelector, resultSelector);
}
public static IEnumerable<dynamic> SelectMany(this object source,
Func<object, IEnumerable<dynamic>> selector)
{
return Select(source).SelectMany<object, object>(selector);
}
public static IEnumerable<dynamic> SelectMany(this object source,
Func<object, int, IEnumerable<dynamic>> selector)
{
return Select(source).SelectMany<object, object>(selector);
}
}
To add insult to injury, the following works:
var docs = new dynamic[0];
var q = from doc in docs
where doc["@metadata"]["Raven-Entity-Name"] == "Cases"
where doc.AssociatedEntities != null
from entity in doc.AssociatedEntities
where entity.Tags != null
from tag in entity.Tags
select new { tag.ReferencedAggregate.Id, doc.__document_id };
It is only when I add:
where tag.ReferencedAggregate != null
That I get an error two lines before:
where entity.Tags != null // COMPILER ERROR HERE
Not sure what is going on