【问题标题】:Building a Dynamic Where Lambda for LinqToSql为 LinqToSql 构建动态 Where Lambda
【发布时间】:2015-08-30 05:57:58
【问题描述】:

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

这是一个(简化的)方法,它应该查询我的联系人表并返回域对象联系人列表。

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 创建了一个表达式树(为简洁起见,从上面的代码中删除了),但是无法让 Epression Tree 为 Where 工作。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我只是知道这会是一件令人讨厌的事情。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多