Linq可选参数

des*_*guy 7 .net c# linq dynamic

我有一个linq查询.我从我收集的表单中获取了一堆参数,我需要根据用户搜索的字段进行过滤.

IQueyable<Users> user = from user in edmxObject.Users
where user.FirstName.Contains(model.FirstName ?? user.FirstName)
&& user.UserName.Contains(model.UserName ?? user.UserName)
Run Code Online (Sandbox Code Playgroud)

我还有一些非字符串字段过滤器需要过滤,包括long和boolean.如果用户没有选择任何内容,它们可能为空.如何将它们包含在查询中.

Yuc*_*uck 16

这是LINQ如此强大的最佳示例之一 - 延迟执行.您可以在不同的阶段构建查询,并且只有在最终执行或解析查询时才会生成SQL语句:

var query = edmxObject.Users.AsQueryable<Users>();

if (! String.IsNullOrEmpty(model.FirstName)) {
    query = from user in query
            where user.FirstName.Contains(model.FirstName)
            select user;
}
if (! String.IsNullOrEmpty(model.UserName) {
    query = from user in query
            where user.UserName.Contains(model.UserName)
            select user;
}

// this will cause the query to execute get the materialized results
var result = query.ToList();
Run Code Online (Sandbox Code Playgroud)

  • 它取决于DataContext,但您可能需要将`query`定义为`IQueryable <>`而不是使用`var`.有些提供者将它作为实现`IQueryable <>`的类.您还可以在`Users`之后添加`AsQueryable()`. (3认同)

rec*_*ive 5

如果查询不包含特定字段,则根本不需要将其作为where子句的一部分包含在内:

IQueyable<Users> user = from user in edmxObject.Users;

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName)

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age);
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式有条件地嵌套谓词,以确保您只有您真正需要的条件.