LINQ - 如何保存我的(复杂)结果?

jwd*_*jwd 5 linq linq-to-entities

我有LINQ查询,它是以零碎的方式构建的,如下所示:

var initialQuery = from item in MyContext where xxx == yyy select item;    
var furtherQuery = from item in initialQuery where bla == foo select new { some stuff };

// more code here...

// eventually:
var yetAnotherQuery = (from item in furtherQuery ...)
                      .OrderBy(my_condition);

// As far as I know, the following query should still maintain the order of the previous one
// see: https://stackoverflow.com/questions/911942/are-subqueries-in-linqtosql-guaranteed-to-be-in-the-same-order-as-their-parent

var stillAnotherQuery = (from item in yetAnotherQuery
                         select item.data_I_care_about)
                         .Distinct();

// And finally...
var finalQuery = stillAnotherQuery.Skip(PageIndex).Take(PageSize);
Run Code Online (Sandbox Code Playgroud)

但是我在Skip()调用时遇到异常,说查询没有被命令!显然,我在上面的代码注释中指出的内容和引用的SO问题并不完全正确.实际上,另一个SO答案表明不保证该订单的保存.

有谁知道做我想要完成的事情的好方法?

我考虑ROW_NUMBER在我的中间结果中简单地包含一个,并在最后按顺序排序,但我找不到ROW_NUMBER通过LINQ在我的结果中得到它的方法.

我见过几个其他 SO 问题,试图让ROW_NUMBER在那里,但他们都是客户方,据我所看到的.

我好像把自己画在了角落里.有人知道(LINQ友好)出路吗?


UPDATE


有人建议我在Distinct()之前做OrderBy().我相信这会给我不同的结果.

想象一下,我有这个数据表

myRank | myData
-------+--------
   3   |    A
   1   |    B
   2   |    A
Run Code Online (Sandbox Code Playgroud)

假设我订购了myRank,我关心的数据是myData,并想象我的原始代码是这样的:

var query = from item in MyTable
            select item;

query = query.OrderBy(item => item.myRank);

var derivedQuery = from item in query        // Note: we throw away myRank
                   select item.myData;

derivedQuery = derivedQuery.Distinct();
Run Code Online (Sandbox Code Playgroud)

如果我交换了OrderBy()和的顺序Distinct(),我会得到不同的结果.我不想myRank被列入Distinct().

对不起,这是一个更大的过程的一部分,因此很难将所有细节都纳入这个问题.

但希望这有道理吗?

seh*_*ehe 2

问题不在于元素不再排序。

相反,问题在于 Distinct() 返回 aIQueryable<T>而 OrderBy() 返回IOrderedQueryable<TSource>,这(显然)是分页与 EF 配合使用所必需的

交换 Distinct() 和 OrderBy() 步骤应该可以解决问题

编辑

我建议大致是这样的:

var query = from item in MyTable
        select item;

query = query.GroupBy(item => item.myData, item => item.myRank);
var derivedQuery = query.OrderBy(group => group.Min())
                        .Select(group.Key);
Run Code Online (Sandbox Code Playgroud)

澄清:

  • 无论如何,group by 都会产生不同的键(myData)
  • 按每组的 Min() 排序myRank将产生与首先按 myRank 全局排序(升序)相同的顺序,然后执行 Distinc()