我有一个组合框和一个文本框。我可以在组合框中选择一个列,然后搜索该东西。
所以,如果我选择" country"并输入文本框"荷兰" (或其中的一部分)它应该培养住在荷兰的所有客户。
然而,这不起作用。
我现在这个国家已经硬编码,但我如何制作这种动态,所以我在组合框中选择了什么?
这是我的代码:
{{1}}
答案 0 :(得分:2)
蛮力/直截了当:
IQueryable<customer> customers = from x in context.customers
where (ComboBox.SelectedValue == "Country") && x.country.Contains(SearchBox.Text)
|| (ComboBox.SelectedValue == "City") && x.city.Contains(SearchBox.City)
|| (ComboBox.SelectedValue == "State") && x.state.Contains(SearchBox.State)
select x;
上述解决方案绝对没有任何问题,但是很多工程师都会嗤之以鼻,因为它似乎不易维护或优雅。 Harumph。
花哨/优雅(a.k.a。复杂):
注意:您必须按照与searches
数组匹配的顺序排列ComboBox中的项目。
static private readonly Func<customer, string>[] _searches;
static private Class() //Static constructor
{
_searches = new Func<customer,string>[]
{
(c) => customer.City,
(c) => customer.State,
(c) => customer.Country
}
}
protected virtual void DoSearch() //Handles the search event
{
var search = _searches[ComboBox.SelectedIndex];
IQueryable<customer> customers = from x in context.customers
where search(x).Contains(SearchBox.Text)
select x;
}
这里的想法是你在数组中设置一系列lambdas。每个lambda接受一个客户作为输入并返回其中一个属性。
当用户触发搜索时,您可以使用组合框中的序号位置来选择与要搜索的属性对应的lambda表达式。然后在LINQ中使用lambda表达式,使WHERE表达式搜索lambda选择的属性。
使用字典
如果你不喜欢数组和组合框排序之间的依赖关系,你可以改用字典:
static private readonly Dictionary<string, Func<customer, string>> _searches;
static private Class() //Static constructor
{
_searches = new Dictionary<string, Func<customer,string>>();
_searches.Add("City", (c) => customer.City);
_searches.Add("State", (c) => customer.State);
_searches.Add("Country", (c) => customer.Country);
}
protected virtual void DoSearch() //Handles the search event
{
var search = _searches[ComboBox.SelectedValue];
IQueryable<customer> customers = from x in context.customers
where search(x).Contains(SearchBox.Text)
select x;
}