Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串到LINQ表达式?_C#_Linq - Fatal编程技术网

C# 字符串到LINQ表达式?

C# 字符串到LINQ表达式?,c#,linq,C#,Linq,如何将包含查询的字符串转换为实际的LINQ表达式,以便执行它 if(email!= null) { query += "x => x.Email.Contains(email)"; } if (firstname != null) { query += "&& x.FirstName.Contains(firstname)"; } if (lastname != null) { query += "&& x.LastName.Cont

如何将包含查询的字符串转换为实际的LINQ表达式,以便执行它

if(email!= null)
{
    query += "x => x.Email.Contains(email)";
}
if (firstname != null)
{
    query += "&& x.FirstName.Contains(firstname)";
}
if (lastname != null)
{
    query += "&& x.LastName.Contains(lastname)";
}
return context.UserAccounts.Where(query).ToList();

也许我没有正确地看到你的问题,所以如果我错了,请原谅。 如果可以这样做,为什么要将字符串转换为LINQ表达式:

var query = context.UserAccounts;

if(email != null)
{
    query = query.Where(x => x.Email.Contains(email));
}
if (firstname != null)
{
    query = query.Where(x.FirstName.Contains(firstname));
}
if (lastname != null))
{
    query = query.Where(x.LastName.Contains(lastname));
}
return query.toList();
试试这个:

<your collection>.
    .Where(o => (email!= null)? o.Email.Contains(email) : true).
    .Where(o => (firstname != null)? o.FirstName.Contains(firstname) : true).
    .Where(o => (lastname != null)? o.LastName.Contains(lastname) : true).
    ToList();
。
.Where(o=>(email!=null)?o.email.Contains(email):true。
.Where(o=>(firstname!=null)?o.firstname.Contains(firstname):true。
.Where(o=>(lastname!=null)?o.lastname.Contains(lastname):true。
托利斯特();

基本上,这意味着只有在满足条件时才会应用过滤器(就像在if语句中一样)。

您可以将查询保存为
IQueryable
(从
System.Linq
名称空间)而不是保存为字符串


当您最后调用
ToList()
时,
IQueryable
被枚举到
用户帐户的
列表中

如果查询需要where子句的组合,则每次结果都需要保存在查询本身中

var query = context.UserAccounts;

if(email != null)
{
    query = query.Where(x => x.Email.Contains(email));
}
if (firstname != null)
{
    query = query.Where(x => x.FirstName.Contains(firstname));
}
if (lastname != null))
{
    query = query.Where(x => x.LastName.Contains(lastname));
}
return query.ToList();

另一个复杂的方法可能是使用

为什么要使用标记?我觉得这听起来像是一个简单的问题。查找“表达式树”。我想这可能就是您需要的。您应该将
query
构建为
Func
,而不是
string
。如果我理解正确,现在只执行其中一条语句,但是在我的项目中,可能只有一条语句为null,因此我必须在查询中同时执行其他语句。否;您可以在查询中链接多个
.Where()
。如果设置了所有字段,则查询:
context.UserAccounts.Where(x=>x.Email.Contains(Email)).Where(x.FirstName.Contains(FirstName)).Where(x.LastName.Contains(LastName)).toList()
非常好。您要调用
.Where()
三次,每次都会抛出返回值。这对什么有用?如果您可以只使用
&&
,为什么要使用
.Where()
三次?这真是编写
返回上下文.UserAccounts.toList()的快捷方式并给你的电脑一些毫无意义的琐事作为惩罚。或者你可以使用简单的
| |
操作符,比如
。其中(o=>email==null | | o.email.Contains(email))
为什么要重复where 3次?这会不会给最终的SQL添加不必要的where语法,或者LINQ是否足够聪明来过滤掉这些语法?@MikeBovenlander表达式只是一个查询,在执行时(即通过调用ToList())会对其进行评估(和优化)。有一些类似的帖子解释了这一点@Y.S.我已经阅读、检查并测试了这一点;您的答案的简写为:
。其中(o=>(email!=null)?o.email.Contains(email):true。
将在SQL语句中生成额外的不必要的
大小写。但是,
。其中(o=>email==null | | o.email.Contains(email))
将像预期的那样工作,而不需要不必要的
CASE
语句。另一种复杂的方法可能是使用操作命名上面的一些
=>
,在这一点上它与KamielK的相同answer@pinkfloydx33:谢谢你指出
var query = context.UserAccounts;

if(email != null)
{
    query = query.Where(x => x.Email.Contains(email));
}
if (firstname != null)
{
    query = query.Where(x => x.FirstName.Contains(firstname));
}
if (lastname != null))
{
    query = query.Where(x => x.LastName.Contains(lastname));
}
return query.ToList();