WPF / LINQ数据层设计问题

时间:2009-02-02 15:16:25

标签: wpf linq

我正在使用C#2008中的Pro WPF中的“数据绑定”一章。

他们让你设置这个课程:

public class StoreDB
{
    public Contact GetContact(int id) {...}
    public List<Contact> GetContacts() {...}
}

我们的想法是调用这些方法,获取ContactList<Contact>并使用后一种方法的LINQ将这些方法绑定到适当的控件,以过滤/排序对象。

这一切都有道理。

但是,如果您有100,000个联系人并且想要获得3个联系人,会发生什么?你的GetContacts()方法获得了100,000,你的LINQ选择了其中三个?

这不是非常低效吗?

如何构建真实世界的应用程序来避免这种情况?

4 个答案:

答案 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训练,

这是一个非常直接开始学习的优秀来源。

Vido Traning WPF

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。