为 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 工作。
您需要在 param
和 lambda1
中使用 Data.Contact
(而不是 TLW.Models.Contact
和 Contact
)
我正在尝试创建一个动态的 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 工作。
您需要在 param
和 lambda1
中使用 Data.Contact
(而不是 TLW.Models.Contact
和 Contact
)