C# Linq可选参数

C# Linq可选参数,c#,.net,linq,dynamic,C#,.net,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) IQueyable user=

我有一个linq查询。我收集了一个表单中的一组参数,需要根据用户搜索的字段进行筛选

IQueyable<Users> user = from user in edmxObject.Users
where user.FirstName.Contains(model.FirstName ?? user.FirstName)
&& user.UserName.Contains(model.UserName ?? user.UserName)
IQueyable user=来自edmxObject.Users中的用户
其中user.FirstName.Contains(model.FirstName??user.FirstName)
&&user.UserName.Contains(model.UserName??user.UserName)

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

这是说明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();
var query=edmxObject.Users.AsQueryable();
如果(!String.IsNullOrEmpty(model.FirstName)){
query=来自查询中的用户
其中user.FirstName.Contains(model.FirstName)
选择用户;
}
如果(!String.IsNullOrEmpty(model.UserName){
query=来自查询中的用户
其中user.UserName.Contains(model.UserName)
选择用户;
}
//这将导致查询执行以获取具体化的结果
var result=query.ToList();

如果查询不包含特定字段,则根本不需要将其作为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);
IQueyable user=来自edmxObject.Users中的用户;
if(model.FirstName!=null)
users=users.Where(user=>user.FirstName.Contains(model.FirstName)
如果(/*搜索年龄*/)
users=users.Where(user=>user.Age==model.Age);

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

这取决于DataContext,但您可能需要将
query
定义为
IQueryable
,而不是使用
var
。一些提供者将其作为实现
IQueryable
的类。您还可以在
AsQueryable()上,在
Users
之后使用
query=query.Where(u=>u.FirstName.Contains(model.FirstName));
在if语句中。取决于您首选的语法。此列表未知?类似于某种查询生成器?因此,
模型
类具有一些任意属性,这些属性可能与
用户
实体的属性相匹配,或者,关系是否更强?