// Query all records
var q =
dc.tblHelpCentreQuestions.Where(question => question.userID == UserID).Where(question => question.awaitingUserResponse == true || question.awaitingSupportResponse == true).
OrderBy(s => s.awaitingUserResponse).ThenBy(s => s.dateSubmitted).
GroupJoin(
dc.tblHelpCentreReplies,
question => question.ID,
replies => replies.ticketID,
(question, replies) => new { Question = question, RepliesCount = replies.Count() }
);
无论我通过查询放置订单,它似乎只是随机排序。
// Query all records
var q =
dc.tblHelpCentreQuestions.Where(question => question.userID == UserID).Where(question => question.awaitingUserResponse == true || question.awaitingSupportResponse == true).
GroupJoin(
dc.tblHelpCentreReplies,
question => question.ID,
replies => replies.ticketID,
(question, replies) => new { Question = question, RepliesCount = replies.Count() }
).OrderBy(s => s.Question.awaitingUserResponse).ThenBy(s => s.Question.dateSubmitted);
exec sp_executesql N'SELECT [t2].[ID], [t2].[catID], [t2].[subject], [t2].[question], [t2].[userID], [t2].[dateSubmitted], [t2].[isUrgent], [t2].[emailMe], [t2].[awaitingSupportResponse], [t2].[awaitingUserResponse], [t2].[lastReply], [t2].[stopWatchTotalMins], [t2].[isStopWatchOn], [t2].[stopWatchStart], [t2].[priorityLevel], [t2].[value] AS [RepliesCount]
FROM (
SELECT [t0].[ID], [t0].[catID], [t0].[subject], [t0].[question], [t0].[userID], [t0].[dateSubmitted], [t0].[isUrgent], [t0].[emailMe], [t0].[awaitingSupportResponse], [t0].[awaitingUserResponse], [t0].[lastReply], [t0].[stopWatchTotalMins], [t0].[isStopWatchOn], [t0].[stopWatchStart], [t0].[priorityLevel], (
SELECT COUNT(*)
FROM [dbo].[tblHelpCentreReplies] AS [t1]
WHERE ([t0].[ID]) = [t1].[ticketID]
) AS [value]
FROM [dbo].[tblHelpCentreQuestions] AS [t0]
) AS [t2]
WHERE (([t2].[awaitingUserResponse] = @p0) OR ([t2].[awaitingSupportResponse] = @p1)) AND ([t2].[userID] = @p2)
ORDER BY [t2].[awaitingUserResponse], [t2].[dateSubmitted]', N'@p0 int,@p1 int,@p2 int', @p0 = 1, @p1 = 1, @p2 = 81
我通过数据库运行代码并正确返回结果,因此它必须是其他奇怪的东西,因为代码非常简单,但不要介意,感谢所有人的帮助,我学会了很多新事物都有这个问题!
答案 0 :(得分:4)
这是LINQ to SQL吗?我怀疑问题是你在分组之前订购。你可以试试这个:
var q = dc.tblHelpCentreQuestions
.Where(question => question.userID == UserID)
.Where(question => question.awaitingUserResponse
|| question.awaitingSupportResponse)
.GroupJoin(dc.tblHelpCentreReplies,
question => question.ID,
replies => replies.ticketID,
(question, replies) => new { Question = question,
RepliesCount = replies.Count() })
.OrderBy(s => s.Question.awaitingUserResponse)
.ThenBy(s => s.Question.dateSubmitted);
编辑:好的,如果这不起作用那么也许这是SQL分组的限制......虽然这看起来很奇怪。
您可以随时强制在客户端执行排序:
var q = dc.tblHelpCentreQuestions
.Where(question => question.userID == UserID)
.Where(question => question.awaitingUserResponse
|| question.awaitingSupportResponse)
.GroupJoin(dc.tblHelpCentreReplies,
question => question.ID,
replies => replies.ticketID,
(question, replies) => new { Question = question,
RepliesCount = replies.Count() })
// Force the rest of the query to execute in .NET code (Enumerable.XXX)
.AsEnumerable()
.OrderBy(s => s.Question.awaitingUserResponse)
.ThenBy(s => s.Question.dateSubmitted);
答案 1 :(得分:3)
您是否尝试过将OrderBy移至最后一次操作,就在之前;?像SQL一样,如果我在订购后对它执行任何操作,我不希望收到有序集...我很想知道按顺序显示实际生成的SQL是什么。
编辑代码探索使用ToList()强制执行,然后执行客户端排序:
var q = dc.tblHelpCentreQuestions
.Where(question => question.userID == UserID)
.Where(question => question.awaitingUserResponse == true || question.awaitingSupportResponse == true)
.GroupJoin(
dc.tblHelpCentreReplies,
question => question.ID,
replies => replies.ticketID,
(question, replies) => new { Question = question, RepliesCount = replies.Count() }
)
.ToList()
.OrderBy(s => s.Question.awaitingUserResponse)
.ThenBy(s => s.Question.dateSubmitted);
答案 2 :(得分:3)
GroupJoin很可能会覆盖订单。它可能是作为子查询实现的。如果您运行LINQ to SQL Profiler或SQL分析器以查看基础查询,它将能够阐明这一点。您是否尝试将OrderBy作为方法链中的最后一个操作?
答案 3 :(得分:3)
如果您想订购分组问题,则需要在创建GroupJoin后执行此操作:
var q =
dc.tblHelpCentreQuestions.Where(question => question.userID == UserID).Where(question => question.awaitingUserResponse == true || question.awaitingSupportResponse == true).
GroupJoin(
dc.tblHelpCentreReplies,
question => question.ID,
replies => replies.ticketID,
(question, replies) => new { Question = question, RepliesCount = replies.Count() }
).
AsEnumerable().
OrderBy(s => s.Question.awaitingUserResponse).
ThenBy(s => s.Question.dateSubmitted);
GroupJoin
会有效地删除您的订单,因为它会按照您的订单收集并按问题对其进行分组。 GroupJoin
不保留密钥的初始排序。
编辑:您可以通过在GroupQoin之后转换为可枚举来强制在LINQ to Objects中进行排序来消除此问题。
答案 4 :(得分:2)
很难测试你的代码,因为我没有你的所有声明,但我怀疑你看似随机行为的原因是因为GroupJoin
不保证保持订单完整。
因此,您必须在分组后进行排序。
例如:
var q = dc.tblHelpCentreQuestions
.Where(question => question.userID == UserID)
.Where(question => question.awaitingUserResponse == true || question.awaitingSupportResponse == true)
.GroupJoin(
dc.tblHelpCentreReplies,
question => question.ID,
replies => replies.ticketID,
(question, replies) => new { Question = question, RepliesCount = replies.Count() }
)
.OrderBy(s => s.Question.awaitingUserResponse)
.ThenBy(s => s.Question.dateSubmitted);
答案 5 :(得分:2)
尝试在LINQ查询后添加ToArray()。我知道LINQ遵循惰性求值规则,并且ToArray()迫使评估变得急切。