2014-01-16 65 views
1

這是我的代碼。任何人都可以幫助我重構這段代碼。我試圖使用字段名稱作爲變量,所以我不必使用開關大小寫。有點像從dr in db.Users where dr.FieldName.Contains(value)C#Linq使用字段名稱作爲變量的數據庫查詢

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

看看[t他的類似問題](http://stackoverflow.com/questions/3682835/if-condition-in-linq-where-clause) –

回答

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(); 
} 
+0

一些提供者(我認爲EF 5)可能沒有正確地參數化上面的代碼片段中的查詢。爲了得到參數化查詢,我要做的就是在'Tuple'包裹的價值,並得到了'Item1'屬性: '變種集裝箱=新的記錄(值); var containerExpression = Expression.Constant(container,typeof(Tuple )); var valueExp = Expression.Property(containerExpression,「Item1」);' – felipe

+0

@Kosar歡迎您!如果解決了您的問題,您應該考慮將答案標記爲已接受。這就是如此工作! – MarcinJuraszek

+0

@Marcin,我試圖標記爲已接受,無法找到任何鏈接,按鈕或類似的東西。你能指導我如何做到這一點。 – Ali

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(); 
相關問題