EF4 LINQ Include(string) alternative to hard-coded string?

前端 未结 7 2287
借酒劲吻你
借酒劲吻你 2020-12-29 11:13

Is there any alternative to this:

Organizations.Include(\"Assets\").Where(o => o.Id == id).Single()

I would like to see something like:<

7条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-29 11:38

    That's pretty easy to do, using Expressions :

    public static class ObjectQueryExtensions
    {
        public static ObjectQuery Include(this ObjectQuery objectQuery, Expression> selector)
        {
            MemberExpression memberExpr = selector.Body as MemberExpression;
            if (memberExpr != null)
            {
                return objectQuery.Include(memberExpr.Member.Name);
            }
            throw new ArgumentException("The expression must be a MemberExpression", "selector");
        }
    }
    

    You can use it exactly as in the example in your question


    UPDATE

    Improved version, which supports multiple chained properties :

    public static class ObjectQueryExtensions
    {
        public static ObjectQuery Include(this ObjectQuery objectQuery, Expression> selector)
        {
            string propertyPath = GetPropertyPath(selector);
            return objectQuery.Include(propertyPath);
        }
    
        public static string GetPropertyPath(Expression> selector)
        {
            StringBuilder sb = new StringBuilder();
            MemberExpression memberExpr = selector.Body as MemberExpression;
            while (memberExpr != null)
            {
                string name = memberExpr.Member.Name;
                if (sb.Length > 0)
                    name = name + ".";
                sb.Insert(0, name);
                if (memberExpr.Expression is ParameterExpression)
                    return sb.ToString();
                memberExpr = memberExpr.Expression as MemberExpression;
            }
            throw new ArgumentException("The expression must be a MemberExpression", "selector");
        }
    }
    

    Example :

    var query = X.Include(x => x.Foo.Bar.Baz) // equivalent to X.Include("Foo.Bar.Baz")
    

提交回复
热议问题