代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何使用委托按名称获取CompiledQuery

  •  0
  • Andrew  · 技术社区  · 14 年前

    我正在尝试查找并运行名为的已编译查询。如何按名称访问已编译的查询,然后如何调用委托?

    这里是我能得到的-我得到错误'错误绑定到目标方法'

    public class ActivityRepository
    {
        private readonly ActivityDataContext _db;
    
        public ActivityRepository()
        {
            _db = new ActivityDataContext();
        }
    
        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 Func<ActivityDataContext, Guid, IQueryable<Report>>
            GetCompiledReports = CompiledQuery.Compile
                ((ActivityDataContext db, Guid itemId) =>
                 from c in db.Reports
                 where c.reportObjectId == itemId
                 select c);
    

        delegate IQueryable<IProjectObject> MyDelegate();
    
        static MyDelegate GetByName(object target, string methodName)
        {
                return (MyDelegate)Delegate.CreateDelegate
                    (typeof(MyDelegate), target, methodName);
        }
    
        public IList<Results> GetResults(string reportName)
        {
                IQueryable<ProjectObject> projectItems = GetLatestProjectObjects(projectId, quantity);
            foreach (projectObject o in projectItems)
            {
                MyDelegate del = GetByName(this, reportName);
                 var dbReport = (IProjectObject) GetCompiledReports(_db, o.itemId).FirstOrDefault();
    // add results to List and return
             }
         }
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Matthew Abbott    14 年前

    [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);
    

    希望有帮助:)