2013-07-28 82 views
3

我想用paremeter更改where子句。示例中我有2個字符串變量。Lambda表達式if-else語句在where子句中

string searchText="John"; 
string userField="Name"//it can be ID,UserName or Email 

我想改變用戶屬性(a.Name)根據 「字符串userField =」 名稱 「/」

var a entities.Users 
    where a.Name==searchText //a.Name(Name) is declared in userField. It can be ID,UserName or Email      

我的代碼如下所示:

var users = new 
       { 
        total = 10, 
        page = page, 
        record = (entities.Users.Count()), 
        rows = (from user in entities.Users 
          select new 
          { 
           ID = user.ID, 
           Name = user.Name, 
           UserName = user.UserName, 
           UserType = user.Role.Name, 
           Email = user.Email, 
           CreatedDate = user.CreatedDate, 
           UpdatedDate = user.UpdatedDate 
          }).AsEnumerable().Select(m => new { ID = m.ID, Name = m.Name, UserName = m.UserName, Email = m.Email, UserType = m.UserType, CreatedDate = String.Format("{0:d/M/yyyy HH:mm:ss}", m.CreatedDate), UpdatedDate = String.Format("{0:d/M/yyyy HH:mm:ss}", m.UpdatedDate) }), 
       }; 

如何我可以用這個拉姆達表達來做到嗎?

+1

所以這裏的挑戰是真的,你有一個包含「名稱」的字符串,你要,要了鏈接的屬性在被查詢的對象上有相同的名字? – Tormod

+0

不清楚你在問什麼。你想按條件篩選查詢嗎? –

+0

謝謝你的回答。我想根據「字符串userField =」名稱「/」更改用戶屬性。問題已更新。 – fuat

回答

2

你可以嘗試以下方法:

.Where(u => (userField == "ID" && u.Id == searchText) 
     || (userField == "Name" && u.Name == searchText) 
     || (userField == "Email" && u.Email == searchText) 
     ) 
2

我寧願擴展方法的語法在這種情況下,做它像這樣:

IQueryable<User> query = entities.Users; 
switch (userField) 
{ 
    case "ID": 
     int searchID; 
     if (int.TryParse(searchText, out searchID)) 
      query = query.Where(u => u.ID == searchID); 
     else 
      query = query.Where(u => false); 
     break; 

    case "Name": 
     query = query.Where(u => u.Name == searchText); 
     break; 

    case "Email": 
     query = query.Where(u => u.Email == searchText); 
     break; 
} 

var users = new 
{ 
    total = 10, 
    page = page, 
    record = (entities.Users.Count()), 
    rows = (from user in query 
      select new 
      // etc. 
      ) 
}; 
1

只要你想創建的where子句動態,我會建議你使用Dynamic LINQ。它允許你動態地創建where子句。

1

Dynamic solution

string searchText="John"; 
string userField= "Name"; 

/* I leave it as an exercixe to add the TypeConversion if Id is Int */ 
ParameterExpression pe = Expression.Parameter(typeof(User),"usr"); 
Expression left = Expression.Property(pe, typeof(User).GetProperty(userField)); 
Expression right = Expression.Constant(searchText); 
Expression equ = Expression.Equal(left, right); 

var whereExpr = Expression.Lambda<Func<User, bool>>(
     equ, 
     new ParameterExpression[] { pe }); 

var a = entities.Users.Where(whereExpr); 
+0

謝謝大家。你所有的答案都有效。我首選jyparask答案。這很容易。 – fuat