为LinqToSql构建一个动态Where Lambda

时间:2015-08-30 05:57:58

标签: c# linq linq-to-sql lambda

我正在尝试创建一个动态where子句,以允许用户选择一个字段并输入过滤条件。我已经尝试了很多解决方案而且无法将它们整合在一起。我想我很接近,但是不能过去最后一次错误。

这是(dumbed down)方法,应该查询我的联系人表并返回域对象联系人列表。

internal static IEnumerable<Contact> GetContacts(int pageSize, int page, string searchField, string searchValue)
{
    var pageContacts = new List<Contact>();
    using (var db = new TLWDatabaseDataContext())
    {
        var param = Expression.Parameter(typeof(TLW.Models.Contact), "t");
        // MemberExpression member = Expression.Property(param, filter);
        ConstantExpression constant = Expression.Constant(searchValue, searchValue.GetType());
        BinaryExpression exp = Expression.Equal(Expression.PropertyOrField(param, searchField), constant);
        Expression<Func<Contact, bool>> lambda1 = Expression.Lambda<Func<Contact, bool>>(exp, param);

        IQueryable<Data.Contact> dbContacts = db.Contacts.AsQueryable();
        dbContacts = dbContacts.Where(lambda1);
        dbContacts = dbContacts.Skip(page * pageSize).Take(pageSize);
        pageContacts.AddRange(dbContacts.Select(contact => new Contact
        {
            Address1 = contact.Address1,
            Address2 = contact.Address2,
            CellPhone = PrettyPhone(contact.CellPhone),
            City = contact.City,
            Created = contact.CreatedOn,
            Email = contact.Email,
            FirstName = contact.FirstName,
            HomePhone = PrettyPhone(contact.HomePhone),
            Id = contact.Id,
            LastName = contact.LastName,
            LastUpdated = contact.LastUpdated,
            State = contact.State,
            WorkPhone = PrettyPhone(contact.WorkPhone),
            Zip = contact.Zip
        }));
    }
    return pageContacts;
}

这是如此接近,但我在行dbcontacts = dbContacts.Where(lambda1)上有编译器错误。

由于将lambda1参数发送到Where时发生转换,因此发生错误。错误的文本是......

错误CS1503参数2:无法转换为&#39; System.Linq.Expressions.Expression&gt;&#39;到&#39; System.Linq.Expressions.Expression&gt;&#39;

任何指导的TIA。我已经为我的OrderBy成功创建了一个表达式树(为了简洁起见,从上面的代码中删除了),但是却无法让一个Epression Tree适用于Where。

1 个答案:

答案 0 :(得分:0)

您需要在Data.Contactparam中使用lambda1(而不是TLW.Models.ContactContact