我正在尝试创建一个动态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。
答案 0 :(得分:0)
您需要在Data.Contact
和param
中使用lambda1
(而不是TLW.Models.Contact
和Contact
)