【发布时间】:2015-04-24 02:29:50
【问题描述】:
我继承了一个应用程序,并正在尝试调试为什么在我之前编写的通过 Entity Framework 6 运行的查询之一的结果中缺少字段。
最初的开发人员创建了一个系统,该系统接受实体上下文、过滤器 Lambda 表达式、按限制排序和包含的属性。为了让我使用查询来查看缺少的内容,我想从函数末尾放在一起的 IQueryable 中提取 Linq/Lambda 查询,以便在 Linqpad 中执行它。
理想情况下,我想看看什么样的“select x from XTable.Include("SomeOtherTable").Where(Predicates)" 拼凑在一起?我知道如何查看生成的 SQL,但这对找出需要更改的参数没有多大帮助。
这是函数。在应用 Skip/Take/ToArray/ToList 之前,我基本上需要两个 return 语句之一中的 end linq 语句。
protected override IEnumerable<T> GetPagedEntity(MyDBContext entityContext, int skip, int take, System.Linq.Expressions.Expression<Func<T, bool>> filter, string orderBy, string includeProperties, out int count)
{
IQueryable<T> query = entityContext.Set<T>();
string[] orderby = !string.IsNullOrEmpty(orderBy) ? orderBy.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) : null;
if (filter != null)
{
query = query.Where(filter);
}
count = query.Count();
if (!string.IsNullOrEmpty(includeProperties))
{
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
}
if (!string.IsNullOrWhiteSpace(orderBy) && orderby != null && orderby.Length > 0)
{
for (int i = 0; i < orderby.Length; i++)
{
if (i == 0)
{
if (orderby[i].ToLower().Contains(" desc"))
{
query = FilterExpressionUtil.OrderByDescending(query, orderby[i].Trim().Split(' ')[0]);
}
else
{
query = FilterExpressionUtil.OrderBy(query, orderby[i].Trim());
}
}
else
{
if (orderby[i].ToLower().Contains(" desc"))
{
query = FilterExpressionUtil.ThenByDescending(query as IOrderedQueryable<T>, orderby[i].Trim().Split(' ')[0]);
}
else
{
query = FilterExpressionUtil.ThenBy(query as IOrderedQueryable<T>, orderby[i].Trim());
}
}
}
return query.Skip(skip).Take(take).ToArray().ToList();
}
else
{
return query.OrderBy(a => 1).Skip(skip).Take(take).ToArray().ToList();
}
}
【问题讨论】:
-
如果可能的话,尝试完全摆脱这个方法,因为除了完全模糊之外,它会导致执行2次查询,通过在这个方法中执行
query.Count(),在返回查询之前. -
感谢您的意见。如果我有我的选择,我会把这该死的东西都吃掉,但现在我必须克服我的限制和我的最后期限。
-
我猜你应该在使用 ToArray() 运行它之前检查查询对象的 Expression 属性。
标签: c# linq entity-framework lambda