如何在where子句EF 5.0中使用多个语句?

时间:2013-08-04 07:23:26

标签: entity-framework

我是EF 5的新手。我有一个简单的搜索要求,用户可以根据几个搜索条件搜索给定的权利(Say客户)。用户可以选择是否使用标准。搜索条件需要“和”所有标准。所以我写这样的代码

IQueryable _customer;
_customer = from c in context.Customer                       

    where 
                (txtCustomerName.Text.Length == 0 || c.name == txtCustomerName.Text)
                && (txtpropcust1.Text.Length == 0 || c.customfield1 == txtpropcust1.Text)
                && (txtpropcust2.Text.Length == 0 || c.customfield2 == txtpropcust2.Text)
                && (txtpropcust3.Text.Length == 0 || c.customfield3 == txtpropcust3.Text)
                && (txtpropcust4.Text.Length == 0 || c.customfield4 == txtpropcust4.Text)
                && (txtpropcust5.Text.Length == 0 || c.customfield5 == txtpropcust5.Text)

                select c;

    GridView1.DataContext = _customer;  

我收到的错误是“不支持直接绑定到商店查询的数据(DbSet,DbQuery,DbSqlQuery)。而是使用数据填充DbSet,例如通过调用DbSet上的Load,然后绑定对于本地数据。对于WPF绑定到DbSet.Local。对于WinForms绑定到DbSet.Local.ToBindingList()“。

还有其他方法可以继续吗?

2 个答案:

答案 0 :(得分:2)

因为我假设

GridView1.DataContext = _customer;

你正在使用WPF,错误几乎告诉你所有你需要知道的;您无法直接数据绑定到为您创建的EntityFramework DbSet。可能很简单:

GridView1.DataContext = _customer.AsEnumerable();

答案 1 :(得分:2)

编辑:我或许误解了这个问题。但我认为你不能将direclty绑定到IQueryable,所以你可能需要.ToList()或.ToEnumerable()。我们的提供程序(db2)不喜欢这种语法,因此我的回答。 @Tieson T指出了真正的解决方案。

不确定您的确切问题,但通常是使用if执行此操作。如果在很多地方需要它,你可以编写一个简单的扩展方法来包装这个逻辑

var query = from d in db.Customers;

if (text1.Length > 0) query = query.Where(x => x.Field == text1)
if (text2.Length > 0) query = query.Where(x => x.Other == text2)

var data = query.ToList(); // etc