Этот вопрос немного устарел, но вот два EF-независимых решения, если вы или кто-то еще ищете:
1. Решение на основе отражений
Это решение - то, к чему возвращается .NET Framework, если IQueryable
не приведен к DbQuery
или ObjectQuery
. Пропустите эти приведения (и эффективность, которую они обеспечивают), и вы отделите решение от Entity Framework.
public static class IncludeExtension
{
private static T QueryInclude<T>(T query, string path)
{
MethodInfo includeMethod = query.GetType().GetMethod("Include", new Type[] { typeof(string) });
if ((includeMethod != null) && typeof(T).IsAssignableFrom(includeMethod.ReturnType))
{
return (T)includeMethod.Invoke(query, new object[] { path });
}
return query;
}
public static IQueryable<T> Include<T>(this IQueryable<T> query, string path) where T : class
{
return QueryInclude(query, path);
}
// Add other Include overloads.
}
2. Решение на основе Dyanmics
Здесь метод QueryInclude<T>
использует тип dynamic
, чтобы избежать отражения.
public static class IncludeExtension
{
private static T QueryInclude<T>(T query, string path)
{
dynamic querytWithIncludeMethod = query as dynamic;
try
{
return (T)querytWithIncludeMethod.Include(path);
}
catch (RuntimeBinderException)
{
return query;
}
}
public static IQueryable<T> Include<T>(this IQueryable<T> query, string path) where T : class
{
return QueryInclude(query, path);
}
// Add other Include overloads.
}