2013-07-28 83 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