动态Linq查询在哪里

时间:2017-06-24 00:37:08

标签: c# linq

我有一个组合框和一个文本框。我可以在组合框中选择一个列,然后搜索该东西。

所以,如果我选择" country"并输入文本框"荷兰" (或其中的一部分)它应该培养住在荷兰的所有客户。

然而,这不起作用。

我现在这个国家已经硬编码,但我如何制作这种动态,所以我在组合框中选择了什么?

这是我的代码:

{{1}}

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;
}