[英]C# Linq Query on database using field name as a variable
這是我的代碼。 任何人都可以幫我重構這段代碼。 我正在嘗試使用字段名稱作為變量,所以我不必使用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;
}
您必須使用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();
}
這應該工作:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.