lambda表达式中的混淆查询

时间:2014-08-26 10:09:37

标签: c# wpf lambda

我想执行一个查询,它在点击时从组合框(custIdComboBox)获取值,在数据库中找到它的名称并将其放在文本框中。我很困惑为它制作一个LAMBDA表达式。虽然我已经尝试了很多,但它没有以正确或必要的方式工作。

查询:"select name from customer where custId= " +custIdComboBox.SelectedItem+ ""

我希望结果显示在文本框中(customeName.text)。

我正在尝试的是:customerName.Text = db.customers.Where(s => s.custId == custIdComboBox.SelectedItem).Select(w => w.name).FirstOrDefault();

1 个答案:

答案 0 :(得分:1)

假设您的SelectedItemCustomer

var customer = db.customers.FirstOrDefault(s => s.custId == ((Customer)custIdComboBox.SelectedItem).ID);

if (customer != null)
{
     customerName.Text = customer.Name;
}

请注意SelectedItem可能属于不同的类型,这会引发InvalidCastException

修改

好的,让我们看看执行的流程是什么:

  1. 我们在您的客户收藏中使用Enumerable.FirstOrDefault。此方法需要Func<T, bool>并返回第一个匹配。所以我们需要做的是显示我们希望它选择哪个项目的方法

  2. 我们将Func<T, bool>作为Lambda Expression传递。在lambda中我们想说:“请找到s.custId与另一个具有相同id的对象(在你的情况下是s.custId)”

  3. 为了进行匹配,我们使用custIdComboBox.SelectedItemSelectedItem的问题是它的类型为object,而不是Customer类型(您可以在MSDN上查找ComboBox.SelectedItem并看到它返回object )。因此,我们明确将SelectedItem投射到Customer

  4. 演员表之后,我们提取客户的ID属性,使其与迭代集合中任何对象的ID匹配

  5. 如果找不到匹配项,则
  6. FirstOrDefault会返回null,因此我们必须在访问null属性之前进行customer检查。如果它不为空,我们将其Name属性分配给TextBox