C# 从IQueryable中提取Linq查询<;T>;?

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(谓词)”是拼凑在

我继承了一个应用程序,正在尝试调试为什么在我之前编写的Entity Framework 6中运行的一个查询的结果中缺少字段

最初的开发人员创建了一个系统,该系统接受实体上下文、筛选器Lambda表达式、按限制排序和包含的属性。为了让我能够处理查询以查看缺少的内容,我想从函数末尾放在一起的IQueryable中提取Linq/Lambda查询,以便在Linqpad中执行它

理想情况下,我希望看到什么样的“从XTable.Include(“SomeOtherTable”)。Where(谓词)”是拼凑在一起的?我知道如何查看生成的SQL,但这对确定需要更改的参数没有多大帮助

这里是函数。在应用Skip/Take/ToArray/ToList之前,我基本上需要在两个返回语句中的一个语句中使用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();
        }
    }
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();