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

将变量类型传递给方法而不进行枚举

  •  0
  • ctorx  · 技术社区  · 17 年前

    我希望能够将变量类型传递给方法,主要是为了将实体框架查询传递给将应用嵌套对象的公共包含的方法。

    这就是我想做的。。。

    public Person GetPersonByID(int personID)
    {
         var query = from Perspn p in Context.Persons
                     where p.PersonID = personID
                     select p;
    
         ObjectQuery<Person> personQuery = ApplyCommonIncludes<Person>(query);
    
         return personQuery.FirstOrDefault();
    }
    
    
    public ObjectQuery<T> ApplyCommonIncludes<T>(SomeType query)
    {
         return ((ObjectQuery<T>)query)
              .Include("Orders")
              .Include("LoginHistory");
    }
    
    2 回复  |  直到 17 年前
        1
  •  3
  •   Anderson Imes    17 年前

    似乎你真的想要 SomeType 是 ObjectQuery<T> 正确的

    public ObjectQuery<T> ApplyCommonIncludes<T>(ObjectQuery<T> query)
    {
         return query
              .Include("Orders")
              .Include("LoginHistory");
    }
    

    这是有效的语法。这有什么问题吗?

        2
  •  0
  •   ctorx    17 年前

    /// <summary>
    /// Builds Includes
    /// </summary>
    public class IncludeBuilder
    {
        /// <summary>
        /// List of parts for the Include
        /// </summary>
        private List<string> Parts;
    
        /// <summary>
        /// Creates a new IncludeBuilder
        /// </summary>
        private IncludeBuilder()
        {
            this.Parts = new List<string>();
        }
    
    
        /// <summary>
        /// Creates a new IncludeBuilder
        /// </summary>
        public static IncludeBuilder Create()
        {
            return new IncludeBuilder();
        }
    
    
        /// <summary>
        /// Adds a property name to the builder
        /// </summary>
        public IncludeBuilder AddPart<TEntity, TProp>(Expression<Func<TEntity, TProp>> expression)
        {
            string propName = ExpressionHelper.GetPropertyNameFromExpression(expression);
            this.Parts.Add(propName);
    
            return this;
        }
    
    
        /// <summary>
        /// Gets a value of the include parts separated by
        /// a decimal
        /// </summary>
        public override string ToString()
        {
            return string.Join(".", this.Parts.ToArray());
    
        }
    

    这使我能够做到这一点。..

    myPersonRepository.AppendInclude(
         IncludeBuilder.Create()
              .AddPart((Person p) => p.Orders)
              .AddPart((Order o) => o.Items));
    

    上述语句将表达式传递给IncludeBuilder类,然后该类将上述表达式转换为“Orders.Items”。

    然后,我在RepositoryBase中创建了辅助方法,该方法给定一个ObjectQuery,将应用包含、执行查询并返回结果。这不是我想要的,但效果很好。