Вы, вероятно, можете сделать какой-то долгий путь, пытаясь идентифицировать любые поля типа Func <...> с DataContext в качестве первого аргумента, возвращающего IQueryable, но вам может быть гораздо проще просто добавить пользовательский атрибут:
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class DynamicQueryAttribute : Attribute { }
... который вы затем можете добавить в свое поле:
[DynamicQuery]
public static Func<ActivityDataContext, int, IQueryable<ProjectObject>>
GetCompiledLatestProjects = CompiledQuery.Compile
((ActivityDataContext db, int projectId) =>
from c in db.projectObjects
where c.projectId == projectId
select c);
Затем вы можете выбрать запрос на основе этого и его имя:
public static IQueryable<IProjectObject> ExecuteQuery(Type ownerType, string name, params object[] args)
{
var query = typeof(ownerType)
.GetFields(BindingFlags.Public | BindingFlags.Static)
.Where(f =>
(f.GetCustomAttributes(typeof(DynamicQueryAttribute), false).Length > 0)
&& (f.Name.ToLowerInvariant() == name.ToLowerInvariant()))
.Select(f => (Delegate) f.GetValue(null))
.SingleOrDefault();
if (query == null)
return null;
return (IQueryable<IReportObject>)query.DynamicInvoke(args);
}
Использование:
var results = ExecuteQuery(
typeof(ActivityRepository),
"GetCompiledLatestProjects",
dataContext,
projectId);
Надеюсь, что поможет:)