C# 从IQueryable中提取Linq查询<;T>;?
我继承了一个应用程序,正在尝试调试为什么在我之前编写的Entity Framework 6中运行的一个查询的结果中缺少字段 最初的开发人员创建了一个系统,该系统接受实体上下文、筛选器Lambda表达式、按限制排序和包含的属性。为了让我能够处理查询以查看缺少的内容,我想从函数末尾放在一起的IQueryable中提取Linq/Lambda查询,以便在Linqpad中执行它 理想情况下,我希望看到什么样的“从XTable.Include(“SomeOtherTable”)。Where(谓词)”是拼凑在一起的?我知道如何查看生成的SQL,但这对确定需要更改的参数没有多大帮助 这里是函数。在应用Skip/Take/ToArray/ToList之前,我基本上需要在两个返回语句中的一个语句中使用end linq语句C# 从IQueryable中提取Linq查询<;T>;?,c#,linq,entity-framework,lambda,C#,Linq,Entity Framework,Lambda,我继承了一个应用程序,正在尝试调试为什么在我之前编写的Entity Framework 6中运行的一个查询的结果中缺少字段 最初的开发人员创建了一个系统,该系统接受实体上下文、筛选器Lambda表达式、按限制排序和包含的属性。为了让我能够处理查询以查看缺少的内容,我想从函数末尾放在一起的IQueryable中提取Linq/Lambda查询,以便在Linqpad中执行它 理想情况下,我希望看到什么样的“从XTable.Include(“SomeOtherTable”)。Where(谓词)”是拼凑在
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();
}
}
protectedoverride IEnumerable GetPagedEntity(MyDBContext entityContext、int skip、int take、System.Linq.Expressions.Expression过滤器、字符串orderBy、字符串includeProperties、out int count)
{
IQueryable query=entityContext.Set();
string[]orderby=!string.IsNullOrEmpty(orderby)?orderby.Split(新字符[]{',},StringSplitOptions.RemoveEmptyEntries):null;
if(过滤器!=null)
{
query=query.Where(过滤器);
}
count=query.count();
如果(!string.IsNullOrEmpty(includeProperties))
{
foreach(includeProperty.Split中的var includeProperty
(新字符[]{',},StringSplitOptions.RemoveEmptyEntries)
{
query=query.Include(includeProperty);
}
}
如果(!string.IsNullOrWhiteSpace(orderBy)&&orderBy!=null&&orderBy.Length>0)
{
for(int i=0;i1).Skip(Skip).Take(Take).ToArray().ToList();
}
}
您所要做的就是放置一个断点并对查询变量进行快速监视。您还可以使用linq查询
下面的示例显示了生成的LINQ查询
从我所看到的,确实没有太多的提取工作要做,因为很多提取工作都在传递中
IQueryable<T> query = entityContext.Set<T>();
此代码中没有“Where”子句,它是通过System.Linq.Expressions.Expression过滤器
参数传递到函数中的
if (!string.IsNullOrEmpty(includeProperties))
{
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
}
此代码中也没有“Include”子句,它被传递到函数中
下一个大的块是处理“OrderBy”内容,并返回IEnumerable
和Skip(Skip).Take(Take).ToArray().ToList()代码>钉在末端
对于此函数的每个不同调用,您的问题的答案将不同
例如:
GetPagedEntity<User>(
entityContext:declaredContext,
skip:20,
take:40,
filter: (u => u.IsActive == true),
orderBy: "FirstName,LastName",
includeProperties: "table1,table2",
out count:declaredInt
)
GetPagedEntity(
entityContext:declaredContext,
跳过:20,
拍:40,
过滤器:(u=>u.IsActive==true),
orderBy:“FirstName,LastName”,
includeProperties:“表1、表2”,
超出计数:申报
)
将看起来像这样:
declaredContext.Set<User>().Where(u => u.IsActive == true).Include("table1").Include("table2").OrderBy(u => u.FirstName).ThenBy(u => u.LastName).Skip(20).Take(40).ToArray().ToList();
declaredContext.Set().Where(u=>u.IsActive==true).Include(“表1”).Include(“表2”).OrderBy(u=>u.FirstName).ThenBy(u=>u.LastName).Skip(20).Take(40).ToArray().ToList();
输出参数count
将返回Take
方法获取指定数量之前的计数。希望这有帮助,如果我的语法有点不正确,很抱歉。如果可能的话,请尝试完全删除此方法,因为除了完全不清楚之外,它还会导致在返回查询之前在此方法中执行两个查询。query.Count()
。感谢您的输入。如果我有选择的话,我会把整个该死的事情都搞定,但现在我必须克服我的局限性和我所处的最后期限。我想你应该在使用ToArray()运行查询对象之前检查它的表达式属性。当我试着这样做时,我在值中看到的只是{System.Data.Entity.Infrastructure.DbQuery}谢谢。我可能只是需要另一双眼睛来帮我看。
declaredContext.Set<User>().Where(u => u.IsActive == true).Include("table1").Include("table2").OrderBy(u => u.FirstName).ThenBy(u => u.LastName).Skip(20).Take(40).ToArray().ToList();