Silverlight for Windows Phone(SDK 7.1)アプリを作成しており、CompactSQLDBのデータをSilverlightToolkit forWindowsPhoneのLongListSelector
コントロールに表示しています。
リストの長さが約150アイテムになると、アプリはデータの読み込みを実際に遅くし、ページへの移動やページからの移動、アニメーションの表示に失敗します(バックグラウンドスレッドを使用すると、アニメーション用にUIスレッドを解放するのに役立ちます)。
現在、常に使用している3つのクエリがあります。LongListSelectorからのデータが更新されるか、ページがナビゲートされるたびです。私はに変換MoviesByTitle
しましたがCompiledQuery
、それは非常に役立ちました。そのため、他の2つのクエリ(groupedMovies
およびLongListSelector.ItemSource
タイプList<Group<Movie>>
)についても同じことを実行しようとしていましたが、正しい構文を理解できないようです。
これらのクエリをより効率的にする方法についての提案はありCompiledQuery
ますか?
MoviesByTitle
と呼ばれる別のクラスにありますQueries
public static Func<MovieDBContext, IOrderedQueryable<Movies>> MoviesByTitle = CompiledQuery.Compile((MovieDBContext db) => from m in db.Movies orderby m.Title,m.Year select m);
MainPageのフィールド
private static List<String> characters = new List<String> { "#", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
public static List<Group<Movies>> emptyGroups = new List<Group<Movies>>();
MainPageのLoadDB()メソッド内-このメソッドは、DBが更新されるときに、OnNavigatedToおよび他のいくつかの場所で呼び出されます。
//Populates the 'empty' Groups of Movies objects only once.
if (emptyGroups.Count < 1)
{
characters.ForEach(x => emptyGroups.Add(new Group<Movies>(x, new List<Movies>())));
}
IEnumerable<Movies> query = Queries.MoviesByTitle(App.db);
//Groups the objects
IEnumerable<Group<Movies>> groupedMovies = (from t in query
group t by t.GroupHeader into grp
orderby grp.Key
select new Group<Movies>(grp.Key.ToString(), grp));
//Joins the 'empty' group and groupedMovies together for the LongListSelector control
moviesLongList.ItemsSource = (from t in groupedMovies.AsEnumerable().Union(emptyGroups)
orderby t.Title
select t).ToList();
GroupHeader
DBのプロパティMovies
とエンティティです
[Column(CanBeNull=true, UpdateCheck = UpdateCheck.Never)]
public char GroupHeader
{
get
{
char l;
//For Alphabetized Grouping, titles do NOT start with "The ..."
if (this.Title.ToLowerInvariant().StartsWith("the "))
{
l = this.Title.ToLowerInvariant()[4];
}
else
{
l = this.Title.ToLower()[0];
}
if (l >= 'a' && l <= 'z')
{
return l;
}
return '#';
}
set { }
}
Group
クラスは以下の通りです
public class Group<T> : IEnumerable<T>
{
public Group(string name, IEnumerable<T> items)
{
this.Title = name;
this.Items = new List<T>(items);
}
public string Title
{
get;
set;
}
public IList<T> Items
{
get;
set;
}
...
}