2015-11-12 65 views
0

問題:「方法'Skip'只支持LINQ to Entities中的排序輸入。方法'OrderBy'必須在方法'Skip'之前調用。如何按當前訂單排列<object>列表,以便PagedList可以接受?

list2 = list1.Where(a).OrderBy(x => x.Something).Union(list1.Where(x).OrderBy(x => x.SomethingDifferent)); 
return list2.ToPagedList(...); 

我假設發生這種情況是因爲它需要在'聯盟'後添加一個新的'OrderBy'。有沒有辦法把它變成一個OrderedList,同時保持聯盟目前的訂單?

有沒有辦法添加其他排序依據,它實際上並不更改順序,如:

list2 = list1.Where(a).OrderBy(x => x.Something).Union(list1.Where(x).OrderBy(x => x.SomethingDifferent)).OrderBy(x => x.NothingThatWillAffectTheOrder); 

編輯

爲了使這更清楚,我將解釋用一個實際的例子。

假設用戶在電影數據庫中進行搜索,並且想在顯示包含搜索字符串的演員姓名前顯示包含搜索字符串的標題。

list = movies.Where(x => x.Title.Contain...).Union(movies.Where(x => x.Actors.Contain..) 

PagedList不會接受這個,因爲它沒有排序,但是排序這個列表將會失敗聯盟的目的。是否有一個「解決方法」,使其成爲有序列表,同時保持當前的順序?

+0

我刪除了我以前的答案,因爲是可行的:但是這取決於你實際上是用它做什麼,也許你可以只是像壓平我沒有完全理解你的問題。從https://github.com/TroyGoode/PagedList使用PagedList時,我沒有遇到有關「跳過」方法的問題。那是你正在使用的那個? –

+0

是的,那是我正在使用的那個。問題是因爲兩個OrderBys發生在Union之前,所以PagedList不會接受它。我會編輯我的問題以提供更好的示例。 – Tom

+0

我看不出爲什麼會出現該錯誤,但我添加了一個全新功能實現的新答案。 –

回答

1

我不確定你爲什麼會得到你的錯誤。但是,我能夠根據您提供的信息編寫一個可正常工作的程序。看看下面的內容。希望它能幫助你確切地發現你在做什麼不同。 請注意,我的ToString()實現使用了C#6中的新功能。如果您使用的是C#的較舊版本,則必須稍微修改該行。

using PagedList; 
using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    class Actor 
    { 
     public string Title { get; set; } 
     public List<string> Actors { get; set; } 
     public override string ToString() 
     { 
      return $"{Title} featuring {string.Join(", ", Actors)}"; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Actor> movies = new List<Actor>() 
      { 
       new Actor() { Title = "Star Wars", Actors = new List<string>() { "Mark Hamill", "Harrison Ford" } }, 
       new Actor() { Title = "Indiana Jones and The Raiders of the Lost Ark", Actors = new List<string>() { "Karen Allen", "Harrison Ford" } }, 
       new Actor() { Title = "Indiana Jones and The Temple of Doom", Actors = new List<string>() { "Kate Kapshaw", "Harrison Ford" } }, 
       new Actor() { Title = "Indiana Jones and The Kingdom of the Crystal Skull", Actors = new List<string>() { "Cate Blanchett", "Harrison Ford" } }, 
       new Actor() { Title = "Jessica Jones", Actors = new List<string>() { "Krysten Riter", "David Tennant" } }, 
       new Actor() { Title = "The Wizard of Oz", Actors = new List<string>() { "Judy Garland" } }, 
      }; 

      var list = movies.Where(x => x.Title.Contains("Jones")).Union(movies.Where(x => x.Actors.Contains("Harrison"))); 

      var pagedList = list.ToPagedList(1, 2); 

      foreach (var movie in pagedList) 
      { 
       Console.WriteLine(movie); 
      } 
     } 
    } 
} 
1

有一個選擇的過載,可讓您的序號,因此,或許你可以這樣做:

list1.Where(a).OrderBy(x => x.Something) 
    .Union(list1.Where(x).OrderBy(x => x.SomethingDifferent)) 
    .Select((item,idx) => new { item, idx }) 
    .OrderBy(x => x.idx); 

不幸的是,這意味着你沒有像以前那樣選擇同一類型。

.Select((item,idx) => new { item.Title, item.SomeOtherProperty, idx }) 

其中如果無論是消費它可以迴避型,可能

+0

有趣的是,這個問題是22個小時,我們都在幾秒鐘內回答對方。 –

相關問題