如何使用 LINQ 创建条件 where 子句
How can I create a conditional where clause using LINQ
我有一个场景,我只想在必要时使用 WHERE
子句,否则我只想 运行 我的 LINQ 查询没有那个 WHERE
子句。
例如:
if 字符串名称 = "";
var res = (from a in db.person
select new() { Name = a.FullName, DOB = a.DOB }).ToList();
if 字符串名称 = "satya";
var res = (from a in db.person
where a.person.contains(name)
select new() { Name = a.FullName, DOB = a.DOB }).ToList();
我知道为此我们必须分别编写单独的 2 个查询,但如果不编写单独的查询,我们如何将它们组合成一个查询?
你可以这样做:
var res = (from a in db.person
where name == "" || a.person.Contains(name)
select new { Name = a.FullName, DOB = a.DOB }
).ToList();
或者,在这里使用流畅的语法,您可以构建查询并在完成后执行它:
var query = db.person.AsQueryable();
if(!String.IsNullOrEmpty(name)) {
query = query.Where(a => a.person.Contains(name));
}
var result = query.Select(s => new { Name = s.FullName, DOB = s.DOB })
.ToList();
我认为您可以使用代码片段 2 获得与代码片段 1 相同的结果,即使名称包含空字符串。为什么你应该制作 2 个不同的代码。是性能问题吗?
var res = (from a in db.person
where a.person.contains(name) // if empty, it will return all list, just makes sure it's not null before
select new(){Name=a.FullName,DOB=a.DOB}).toList();
我在我的示例代码中尝试了这个,它工作正常
static void TestContains()
{
IList<CustomEntity> _a = new List<CustomEntity>();
IList<CustomEntity> _b = new List<CustomEntity>();
_a.Add(new CustomEntity { ID = 1, Code = "a", Description = "aaa" });
_a.Add(new CustomEntity { ID = 2, Code = "c", Description = "c" });
string name = string.Empty;
_b = _a.Where(a => a.Description.Contains(name)).ToList();
foreach (CustomEntity temp in _b)
{
Console.WriteLine(temp.Description);
}
}
这将是结果
aaa
c
以下操作应该有效,您可以按照自己喜欢的方式对其进行调整以获得所需的结果。只针对空/null字符串或者名字包含在a.person
中的条件,其余的都会导致null,我们最后过滤
db.person.Select(a => {
if ( String.IsEmptyOrNull(name) || a.person.contains(name))
return new {Name=a.FullName,DOB=a.DOB};
else
return null;
}
).Where(x => x != null).ToList()
在文本板上创建,可能存在小语法问题。
我有一个场景,我只想在必要时使用 WHERE
子句,否则我只想 运行 我的 LINQ 查询没有那个 WHERE
子句。
例如:
if 字符串名称 = "";
var res = (from a in db.person
select new() { Name = a.FullName, DOB = a.DOB }).ToList();
if 字符串名称 = "satya";
var res = (from a in db.person
where a.person.contains(name)
select new() { Name = a.FullName, DOB = a.DOB }).ToList();
我知道为此我们必须分别编写单独的 2 个查询,但如果不编写单独的查询,我们如何将它们组合成一个查询?
你可以这样做:
var res = (from a in db.person
where name == "" || a.person.Contains(name)
select new { Name = a.FullName, DOB = a.DOB }
).ToList();
或者,在这里使用流畅的语法,您可以构建查询并在完成后执行它:
var query = db.person.AsQueryable();
if(!String.IsNullOrEmpty(name)) {
query = query.Where(a => a.person.Contains(name));
}
var result = query.Select(s => new { Name = s.FullName, DOB = s.DOB })
.ToList();
我认为您可以使用代码片段 2 获得与代码片段 1 相同的结果,即使名称包含空字符串。为什么你应该制作 2 个不同的代码。是性能问题吗?
var res = (from a in db.person
where a.person.contains(name) // if empty, it will return all list, just makes sure it's not null before
select new(){Name=a.FullName,DOB=a.DOB}).toList();
我在我的示例代码中尝试了这个,它工作正常
static void TestContains()
{
IList<CustomEntity> _a = new List<CustomEntity>();
IList<CustomEntity> _b = new List<CustomEntity>();
_a.Add(new CustomEntity { ID = 1, Code = "a", Description = "aaa" });
_a.Add(new CustomEntity { ID = 2, Code = "c", Description = "c" });
string name = string.Empty;
_b = _a.Where(a => a.Description.Contains(name)).ToList();
foreach (CustomEntity temp in _b)
{
Console.WriteLine(temp.Description);
}
}
这将是结果
aaa
c
以下操作应该有效,您可以按照自己喜欢的方式对其进行调整以获得所需的结果。只针对空/null字符串或者名字包含在a.person
中的条件,其余的都会导致null,我们最后过滤
db.person.Select(a => {
if ( String.IsEmptyOrNull(name) || a.person.contains(name))
return new {Name=a.FullName,DOB=a.DOB};
else
return null;
}
).Where(x => x != null).ToList()
在文本板上创建,可能存在小语法问题。