这是我的代码。任何人都可以帮我重构这段代码。我正在尝试使用字段名称作为变量,所以我不必使用switch case。来自dr in db.Users where dr.FieldName.Contains(value)
的东西。
public static List<User> GetUser(string value, string fieldName)
{
var db = new CCPTDataContext();
var users = new List<User>();
switch (fieldName)
{
case "FirstName":
users = (from dr in db.Users where dr.FirstName.Contains(value)
select new User
{
Username = dr.Username,
FirstName = dr.FirstName,
LastName = dr.LastName
}).ToList();
break;
case "LastName":
users = (from dr in db.Users where dr.LastName.Contains(value)
select new User
{
Username = dr.Username,
FirstName = dr.FirstName,
LastName = dr.LastName
}).ToList();
break;
}
return users;
}
答案 0 :(得分:3)
您必须使用System.Linq.Expression
命名空间:
public static Expression<Func<TSource, bool>> GetPropertyContainsValueExpression<TSource>(string propertyName, string value)
{
var param = Expression.Parameter(typeof(TSource), "x");
var prop = Expression.Property(param, propertyName);
var valueExp = Expression.Constant(value, typeof(string));
var contains = Expression.Call(prop, "Contains", null, valueExp);
return Expression.Lambda<Func<TSource, bool>>(contains, param);
}
那么你就可以这样使用它:
public static List<User> GetUser(string value, string fieldName)
{
var db = new CCPTDataContext();
return db.Users.Where(GetPropertyContainsValueExpression<User>(fieldName, value)).ToList();
}
答案 1 :(得分:0)
这应该有效:
users = (from dr in db.Users
where (fieldName.Equals("FirstName") && dr.FirstName.Contains(value))
|| (fieldName.Equals("LastName") && dr.LastName.Contains(value))
select new User
{
Username = dr.Username,
FirstName = dr.FirstName,
LastName = dr.LastName
}).ToList();