刷新组合框选择的 LINQ 查询已更改

Refreshing LINQ query on ComboBox Selection Changed

我希望能够在组合框中的选择更改后再次枚举查询。它目前正在运行,但必须有更好的方法。

var cmbBox = (from c in db.Addresses
                      select c.City).Distinct();

        cmbQ2.ItemsSource = cmbBox;

        #endregion
    }

    private void cmbQ2_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var q2 = from c in db.Customers
                 join ca in db.CustomerAddresses on c.CustomerID equals ca.CustomerID
                 join a in db.Addresses on ca.AddressID equals a.AddressID
                 where a.City == (string)cmbQ2.SelectedValue
                 select new { Name = c.FirstName, City = a.City };

        lbxQ2.ItemsSource = q2;
    }

如果我没理解错的话,您想将数据访问逻辑移到单独的 file/class 中吗?如果是这种情况,您可以使用存储库模式而不是使用普通的旧 link 查询。

下面是一个使用 EntityFramework 的例子:http://www.codeproject.com/Articles/207820/The-Repository-Pattern-with-EF-code-first-Dependen

如果您正在寻找更流畅的语法...您可以使用这个:

string selectedCity = (string)cmbQ2.SelectedValue;
var query = db.Addresses.Where(address => address.City == selectedCity)
                        .SelectMany(address => address.CustomerAddresses)
                        .Select(customerAddress => new 
                        {
                            Name = customerAddress.Customer.FirstName,
                            City = customerAddress.Address.City
                        });

class CustomerAddress 需要有一个导航 属性 引用 Customer class 和一个导航 属性 到 Address,您还需要 CustomerAddress 的集合作为 Address 上的导航 属性,例如ICollection<CustomerAddress>.

除此之外,我会将所有代码迁移到一个单独的项目中。无论您的用户在哪里与您的网站交互,该层都是表示层问题,因此无论您的应用程序是使用 WinForms、WPF 还是 ASP.NET 开发的,该项目都应该只处理与用户体验、数据表示有关的问题它公开和验证有关输入值、错误消息等。

数据访问逻辑,您在上面编写的逻辑应该在一个单独的逻辑中...您的表示层可以从中请求内容。

我强烈建议您开始研究 N-Tier architecture 以正确构建应用程序。

我还建议您考虑使用 Entity Framework