我正在编写适用于 Windows Phone (SDK 7.1) 的 Silverlight 应用程序,并在LongListSelector
适用于 Windows Phone 的 Silverlight 工具包的控件中显示来自 CompactSQL DB 的数据。
一旦列表长到大约 150 个项目,该应用程序真的会减慢加载数据的速度,在页面之间导航和动画无法显示(我知道使用后台线程将有助于释放 UI 线程用于动画)。
我目前有三个经常使用的查询——每次更新 LongListSelector 中的数据或页面为 NavigatedTo 时。我已经转换MoviesByTitle
成 a CompiledQuery
,这有很大帮助,所以我希望对我的其他两个查询(groupedMovies
和LongListSelector.ItemSource
type 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
是数据库中的一个属性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;
}
...
}