【问题标题】:WPF, EF4, and relationsWPF、EF4 和关系
【发布时间】:2011-08-13 06:14:03
【问题描述】:

关系可能是用错词,但数据表是我以前用过的。我有 EF4 从 SQL 数据库中提取。客户、公司、部门等表格;通常进入组合框进行选择的东西。我将它们保存在静态列表中(只需要在应用启动时填充),并且我有一些组合框 itemssource 绑定到它们,这使得通过绑定 ViewModel 中的选定项目来轻松设置“关联”特定选择。

我的问题是,在一些地方,我只需要一个与数据网格中的 ID 关联的名称,仅用于显示。几百行的 CompanyId 必须是 CompanyName。我担心这里的表现。我可以在查找期间使用 DB FK 来获取名称,但这似乎是一种浪费,因为我将它们全部放在静态列表中。我也不知道延迟加载是否意味着它们在数据绑定期间或在初始查询期间被查找。

这里最好的解决方案是什么?您可以使用静态列表制作 wpf 值转换器吗?获取数据后是否应该对数据执行 foreach,并查看静态列表中的值,将名称存储在对象中?

【问题讨论】:

    标签: wpf entity-framework-4 ivalueconverter datarelation


    【解决方案1】:

    您可以将此逻辑构建到您的查询中:

    var viewModels = (from c in objectContext.Customers
                     select new MyGridViewModel {
                           CustomerId = c.CustomerId,
                           CompanyId = c.CompanyId,
                           CompanyName = c.Company.Name
                     }).ToList();
    

    这将消除获取所有列的需要(仅返回 CustomerId、CompanyId 和 Company Name。您也不会懒惰地加载客户的公司。

    然后您可以简单地将您的视图模型绑定到网格:

    myGrid.ItemsSource = viewModels;
    

    【讨论】:

    • 我对这个解决方案唯一关心的是让 SQL 查找c.Company.Name 一百次可能是一个性能问题。如果应用程序可以使用它已经拉出的列表来执行此操作,我希望它能够更好地工作。当然,这是我的问题,所以如果你不认为这是一个问题,我会同意的。
    • 不会。上面的示例将执行单个查询以返回所有结果。它使用连接和嵌套查询在与 CustomerId 相同的查询中获取 CompanyName。
    【解决方案2】:

    您不能将 ComboBox 所需的静态数据注入到每个 ViewModel 的构造函数中吗?

    例如,在您的构造函数中,您可以传入List<Customer> customers,或者如果您想避免使用实体对象,您可以传入List<CustomerViewModel> customerViewModels,它只包含填充组合框所需的列。

    如果您使用的是依赖注入框架,这将特别容易,但即使您不是,也应该不会太糟糕,这是一个很好的做法。

    【讨论】:

    • 我实际上并没有看到这与我的问题有什么关系。是的,我可以这样做,但那将如何完成我的任务呢?另外,问题不在于组合框,请再读一遍。
    • 我关注的是您关于制作 ValueConverter 的声明。我不认为 ValueConverter 应该是必要的——你可以将你需要的数据注入到你的 ViewModel 中。也就是说,JeffN825 的回答实际上对我来说似乎很可靠。我不会担心 WPF 应用程序的一些额外数据库查询。 SQL Server 等数据库旨在处理巨大的负载。尝试保存各种查询结果以避免某些外键连接肯定是过早优化的示例。如果性能成为问题,那么您可以尝试将一些数据缓存在静态列表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多