Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于方法是否链接在一起的不同Linq到Sql结果_C#_Linq To Sql - Fatal编程技术网

C# 基于方法是否链接在一起的不同Linq到Sql结果

C# 基于方法是否链接在一起的不同Linq到Sql结果,c#,linq-to-sql,C#,Linq To Sql,我正在学习LINQtoSQL,我遇到了一个场景,在这个场景中,我试图构建一个带有排序、过滤和分页的动态查询 如果我运行这样的查询,我可以得到分页结果: IQueryable<WorkOrder> query = (_dataContext.WorkOrders).Skip((search.page - 1) * search.rows).Take(search.rows); var retval = query.ToList(); 在这种情况下,生成的查询如下所示: SELECT

我正在学习LINQtoSQL,我遇到了一个场景,在这个场景中,我试图构建一个带有排序、过滤和分页的动态查询

如果我运行这样的查询,我可以得到分页结果:

IQueryable<WorkOrder> query = (_dataContext.WorkOrders).Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
在这种情况下,生成的查询如下所示:

SELECT <columns>
FROM (
    SELECT ROW_NUMBER() OVER (<columns>) AS [ROW_NUMBER], <columns>
    FROM [dbo].[WorkOrders] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
SELECT <cut for brevity>
FROM [dbo].[WorkOrders] AS [t0]
IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
if (User.IsNotAuthorizedToSeeSomething) {
    query.Where(...);
}
if (search.sortField.Equals("Name")) {
    query.OrderBy(...);
}
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
但是,如果我像这样运行查询,它将不再分页:

IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
在本例中,生成的查询如下所示:

SELECT <columns>
FROM (
    SELECT ROW_NUMBER() OVER (<columns>) AS [ROW_NUMBER], <columns>
    FROM [dbo].[WorkOrders] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
SELECT <cut for brevity>
FROM [dbo].[WorkOrders] AS [t0]
IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
if (User.IsNotAuthorizedToSeeSomething) {
    query.Where(...);
}
if (search.sortField.Equals("Name")) {
    query.OrderBy(...);
}
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
我真的不知道这里发生了什么。。。LINQtoSQL究竟何时生成查询,是否可以向现有IQueryable添加额外的条件,如Skip、Take、OrderBy?我希望最终的结局是这样的:

SELECT <columns>
FROM (
    SELECT ROW_NUMBER() OVER (<columns>) AS [ROW_NUMBER], <columns>
    FROM [dbo].[WorkOrders] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
SELECT <cut for brevity>
FROM [dbo].[WorkOrders] AS [t0]
IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
if (User.IsNotAuthorizedToSeeSomething) {
    query.Where(...);
}
if (search.sortField.Equals("Name")) {
    query.OrderBy(...);
}
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();

在第二种情况下,当第一行执行时,它将继续并对数据库执行查询。然后,Skip和Take作为LINQ to对象而不是LINQ to SQL执行

我真的不知道为什么它会那样做

在这两种情况下,retval的值看起来是否相同。如果我认为正在发生的事情真的发生了,那就应该这样做。

而不是

IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
试一试


每个查询。Xxx没有在查询对象上应用Xxx,而是返回新对象。

您是否尝试在SQL分析器运行的情况下单步执行代码。您能看到SQL实际上是在哪一行发送到数据库的吗?也许这有助于回答您的问题;问题是,我没有意识到每个Linq方法调用实际上都会返回一个新的IQueryable实例。是的,这是关键的缺失部分-您没有将跳过的结果分配给任何对象,因此它不会修改查询。对于问题的其余部分,您完全可以做您想要的事情,你只需要继续遵循qrow在这里展示的相同模式。query=query.Where。。。在你的if语句里面。好的,我现在明白了。我想我认为扩展方法都只是修改了相同的IQueryable实例,但看起来它们实际上为每个方法调用返回了一个新的IQueryable。这个答案绝对解决了我的问题。谢谢如果你把它们连在一起,它会对你隐藏这种复杂性,这就是你感到困惑的原因返回值看起来不一样。。。在第二种情况下,我得到的是生成的查询的结果。我想我应该仔细查看注释。我只是注意到问题是你没有分配结果。我自己也做过很多次。