简体   繁体   English

在where子句中使用lambda Expression if-else语句

[英]Lambda Expression if-else statement in where clauses

I want to change where clauses with paremeter.Example i have 2 string variable. 我想用paremeter更改where子句。例如我有2个字符串变量。

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

I want to change Users property(a.Name) based on "string userField="Name"/" 我想根据“string userField =”Name“/”更改Users属性(a.Name)

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

My code is shown below: 我的代码如下所示:

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) }),
               }; 

How can i do that with this lambada expression? 我怎么能用这个lambada表达式做到这一点?

You may try the following: 您可以尝试以下方法:

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

I would prefer extension method syntax in this situation and do it like so: 在这种情况下我更喜欢扩展方法语法,并且这样做:

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.
           )
};

as you want to create your where clauses dynamically i would recommend you to use Dynamic LINQ . 因为你想动态创建where子句我建议你使用Dynamic LINQ It allows you to create where clauses dynamically. 它允许您动态创建where子句。

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM