如何使用var?bindsource.filter?

时间:2013-07-05 13:32:28

标签: c# linq bindingsource

我有一个查询,从文本框中取名字和姓,我得到一个var。如果我想更改数据源,这可以工作,但这对我没什么帮助,因为它打破了很多代码这样做。我更愿意使用.filter。在这种情况下如何使用.filter?请注意.filter =结果不起作用,原因是“无法将类型'System.Linq.IQueryable'隐式转换为'string'

private void btnSrchInterests_Click(object sender, EventArgs e)
        {
            DataClasses1DataContext db = new DataClasses1DataContext();

            var results = from c in db.CaseSelectors
                          join i in db.Interests on c.CaseNumberKey equals i.CaseNumberKey
                          where i.First.Contains(txtFirst.Text) && i.Last.Contains(txtLast.Text)
                          select c;

            caseSelectorBindingSource.Filter = results;                              

        }

1 个答案:

答案 0 :(得分:2)

results目前是System.Linq.IQueryable,因此无法按照属性Filter的预期转换为字符串。

如果db.CaseSelectors的类型是IList<String>,您可以执行以下操作

caseSelectorBindingSource.Filter = results.Single()

请注意,这会执行linq查询并只返回一个字符串(并且查询只能返回一个项目)。

如果db.CaseSelectors的类型是IList<ComplexType>,您可以执行以下操作

caseSelectorBindingSource.Filter = results.Single().YourFilterProperty;

其中YourFilterProperty是包含带过滤器的字符串的属性

如果您的查询返回多个项目,则执行results.First()或迭代列表来构建过滤器。

修改

辩论之后,完整的答案是:

    private void btnSrchInterests_Click(object sender, EventArgs e)
    {
        DataClasses1DataContext db = new DataClasses1DataContext();

        var results = from c in db.CaseSelectors
                      join i in db.Interests on c.CaseNumberKey equals i.CaseNumberKey
                      where i.First.Contains(txtFirst.Text) && i.Last.Contains(txtLast.Text)
                      select c.CaseNumberKey;

        caseSelectorBindingSource.Filter = ("CaseNumberKey =" + String.Join(" OR CaseNumber = ", results.ToList()) );
    }