为 LinqToSql 构建动态 Where Lambda

Building a Dynamic Where Lambda for LinqToSql

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

这是查询我的 table 联系人和 return 域对象联系人列表的(简化)方法。

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:无法从 'System.Linq.Expressions.Expression>' 转换为 'System.Linq.Expressions.Expression>'

TIA 以获得任何指导。我已经成功地为我的 OrderBy 创建了一个表达式树(为简洁起见从上面的代码中删除了),但就是无法让表达式树为 Where 工作。

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