我正在使用C#2008中的Pro WPF中的“数据绑定”一章。
他们让你设置这个课程:
public class StoreDB
{
public Contact GetContact(int id) {...}
public List<Contact> GetContacts() {...}
}
我们的想法是调用这些方法,获取Contact
或List<Contact>
并使用后一种方法的LINQ将这些方法绑定到适当的控件,以过滤/排序对象。
这一切都有道理。
但是,如果您有100,000个联系人并且想要获得3个联系人,会发生什么?你的GetContacts()
方法获得了100,000,你的LINQ选择了其中三个?
这不是非常低效吗?
如何构建真实世界的应用程序来避免这种情况?
答案 0 :(得分:2)
我建议不的设计让GetContacts返回List&lt; T&gt;。我不完全确定你想使用List&lt; T&gt;因为你要归还的集合是可变的。在WPF中如果你真的喜欢一个可变的项目列表,请尝试ObservableCollection&lt; T&gt;。
但是,我认为最好的界面会返回IEnumerable&lt; T&gt;这是您的SQL或LINQ查询的结果。这将为您的联系人提供一个不可变的联系人集合,可以简单轻松地使用LINQ to Objects过滤。
答案 1 :(得分:1)
我不知道你使用的书,但这里的问题是你使用的数据库,如果你的SQL然后你可以使用LINQ to SQL并通过VS设计器将dbml文件添加到你的项目,然后只需拖动你想要的故事从Sever Explorer视图到dbml使用,所有的bussness对象类都将自动生成。
从那里你可以使用创建的dataContex并使用linq在获取结果之前过滤结果。
您现在正在做的是过滤通过不同方式获取的对象。
HTH, 埃里克
答案 2 :(得分:1)
既然你一直在询问WPF和LINQ队列,我认为你真的想看看WPF和LINQ或ADO.net的一些好的vido训练,
这是一个非常直接开始学习的优秀来源。
HTH, 埃里克
答案 3 :(得分:1)
欢迎来到Linq世界!
您想要返回IQueryable<Contact>
:
public class StoreDB
{
public Contact GetContact(int id) {...}
// change to this:
public IQueryable<Contact> GetContacts() {...}
}
现在你可以这样说而不浪费周期或带宽:
IQueryable<Contact> SerachByFirstName(StoreDB store, string searchParam, int limit)
{
return store.GetContacts()
.Where(c => c.FirstName == searchParam)
.Take(limit);
}
实际上,除非您开始使用IQueryable,否则仍然不会向数据库分派查询。也就是说,您仍然可以添加更多Where()
或OrderBy()
或者什么,并且在最终评估查询时它们将被合并并一起发送到源。
当然,这无法帮助您绑定到UI。但这是一个难题。您必须将基础EntitySet暴露给WPF,或者使用MVVM(或类似)架构来分隔数据访问和UI。