C# where子句中的Lambda表达式if else语句
我想用参数表更改where子句。例如,我有2个字符串变量C# where子句中的Lambda表达式if else语句,c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我想用参数表更改where子句。例如,我有2个字符串变量 string searchText="John"; string userField="Name"//it can be ID,UserName or Email 我想根据字符串userField=Name更改Users propertya.Name/ var a entities.Users where a.Name==searchText //a.Name(Name) is declared in userField
string searchText="John";
string userField="Name"//it can be ID,UserName or Email
我想根据字符串userField=Name更改Users propertya.Name/
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) }),
};
如何使用这个lambada表达式实现这一点?在这种情况下,我更喜欢使用扩展方法语法,并这样做:
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.
)
};
由于您希望动态创建where子句,我建议您使用。它允许您动态创建where子句。您可以尝试以下操作:
.Where(u => (userField == "ID" && u.Id == searchText)
|| (userField == "Name" && u.Name == searchText)
|| (userField == "Email" && u.Email == searchText)
)
因此,这里的挑战实际上是您有一个包含名称的字符串,并且您希望该字符串链接到被查询对象上具有相同名称的属性?不清楚您在问什么。是否要按条件筛选查询?谢谢回答。我想根据字符串userField=Name/更改Users属性。问题更新。谢谢大家。你所有的答案都有效。我更喜欢jyparask的回答。这很容易。
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);