f0s*_*ter 5 c# linq-to-entities
我有一些代码用于在linq中强类型Includes(),就像这样......
public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> subSelector)
{
return mainQuery.Include(((subSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name);
}
/// <summary>
/// Old way: (from dbUser in DataSource.DataContext.Users.Include("UserSubscriptions.ChurchSubscriptions") select dbUser);
/// New way: (from dbUser in DataSource.DataContext.Users.Include<Users, UserSubscriptions>(u => u.UserSubscriptions, s => s.ChurchSubscriptions) select dbUser);
/// </summary>
public static ObjectQuery<T> Include<T, Q>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> tSubSelector, Expression<Func<Q, object>> qSubSelector)
{
string tProperty = ((tSubSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name;
string qProperty = ((qSubSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name;
string path = string.Format("{0}.{1}", tProperty, qProperty);
return mainQuery.Include(path);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,无论如何,我可以为任何级别的连续包括编写更通用的功能帐户吗?而不是必须重写它说3,4等,包括类型?
我猜你所说的连续包含是指额外的子选择器。
如果是这样,则以下函数将参数数组用于附加子选择器(在第一个子选择器之后),同时保持第一个表达式与其他表达式绑定到相同的类型 T。
public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> tSubSelector, params Expression<Func<object, object>>[] subSelectors)
{
var pathBuilder = new StringBuilder(((PropertyInfo)((MemberExpression)tSubSelector.Body).Member).Name);
foreach (var selector in subSelectors)
{
pathBuilder.Append('.');
pathBuilder.Append(((PropertyInfo)((MemberExpression)selector.Body).Member).Name);
}
return mainQuery.Include(pathBuilder.ToString());
}
Run Code Online (Sandbox Code Playgroud)