我写的Windows Phone(SDK 7.1)应用Silverlight的,我在一个显示来自CompactSQL DB数据LongListSelector
从Silverlight工具包控制的Windows Phone。
一旦列表达到约150个条目,该应用程序确实减慢加载数据,导航,并从网页和动画无法显示(我知道使用后台线程将与释放的动画UI线程帮助)。
我现在有一点我经常使用的三个查询 - 每次从LongListSelector数据被更新或页面NavigatedTo。 我已经转换MoviesByTitle
成CompiledQuery
并已帮助了很多,所以我一直在寻找我的其他两个查询做同样的( 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()方法中 - 当数据库被更新调用此方法中的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
是的属性Movies
在DB和实体
[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;
}
...
}