[英]Ignoring null parameter in where clause linq to sql
I need to ignore null parameters in the where clause so that i can fetch the appropriate data with the applied filters from the user side.我需要忽略 where 子句中的空参数,以便我可以从用户端使用应用的过滤器获取适当的数据。 Inorder to acheive this, I am currently using the if..else nested approach which grows in size as the number of parameters grow.为了实现这一点,我目前正在使用 if..else 嵌套方法,该方法随着参数数量的增加而增加。 I would like to know if there is any other effecient way of handling this scenario by avoiding the number of lines and complexity and improving readablility我想知道是否有其他有效的方法可以通过避免行数和复杂性并提高可读性来处理这种情况
public List<Members> GetMembers(int currentPosition, string memberStatus,
string package, string packageStatus, string branch)
{
var members = new List<Members>();
if (package != null)
{
//include package
if (packageStatus != null)
{
//include package, packageStatus
if (branch != null)
{
//include package,packageStatus,branch
members = db.Members.Where(x => x.PackageName == package && x.PackageStatus == packageStatus && x.Branch == branch).ToList();
}
else
{
//include package,packageStatus
members = db.Members.Where(x => x.PackageName == package && x.PackageStatus == packageStatus).ToList();
}
}
else
{
if (branch != null)
{
//include package,branch
members = db.Members.Where(x => x.PackageName == package && x.Branch == branch).ToList();
}
else
{
//include package
members = db.Members.Where(x => x.PackageName == package).ToList();
}
}
}
else
{
if (packageStatus != null)
{
//include packageStatus
if (branch != null)
{
//include packageStatus,branch
members = db.Members.Where(x => x.PackageStatus == packageStatus && x.Branch == branch).ToList();
}
else
{
//include packageStatus
members = db.Members.Where(x => x.PackageStatus == packageStatus).ToList();
}
}
else
{
if (branch != null)
{
//include packageStatus,branch
members = db.Members.Where(x => x.PackageStatus == packageStatus && x.Branch == branch).ToList();
}
else
{
//include nothing
members = db.Members.ToList();
}
}
}
return members;
}
You can add those conditions to the query.您可以将这些条件添加到查询中。 It won't make for the most readable SQL, but assuming you find readable code more important and trust SQL Server's optimizer:它不会成为最具可读性的 SQL,但假设您发现可读代码更重要并且信任 SQL Server 的优化器:
members = db.Members.Where(x =>
(package == null || x.PackageName == package) &&
(packageStatus == null || x.PackageStatus == packageStatus) &&
(branch == null || x.Branch == branch)
).ToList();
Alternatively, you could conditionally append Where()
s to a variable of type IQueryable<Member>
.或者,您可以有条件地将Where()
s 附加到IQueryable<Member>
类型的变量。 See for example entity framework: conditional filter .参见示例实体框架:条件过滤器。
I would like to suggest a readable version of the method:我想建议该方法的可读版本:
public List<Members> GetMembers(int currentPosition, string memberStatus,
string package, string packageStatus, string branch)
{
var members = new List<Members>();
members = db.Members.ToList();
if (package != null)
{
members = members.Where(x => x.PackageName == package);
}
if (packageStatus != null)
{
members = members.Where(x => x.PackageStatus == packageStatus);
}
if (branch != null)
{
members = members.Where(x => x.Branch == branch);
}
return members.ToList();
}
I think this works (haven't tried compiling it but it makes sense in my head)我认为这有效(还没有尝试编译它,但在我的脑海中它是有道理的)
public List<Members> GetMembers(int currentPosition, string memberStatus,
string package, string packageStatus, string branch)
{
List<Members> ret = db.Members()
if(memberStatus != null || package != null || packageStatus != null || branch != null)
{
ret = db.Members.Where(x =>
(memberStatus == null) ? (true) : (memberStatus == x.MemberStatus)
&& (package == null) ? (true) : (package == x.PackageName)
&& (packageStatus == null) ? (true) : (packageStatus == x.PackageStatus)
&& (branch == null) ? (true) : (branch == x.Branch)
).ToList();
}
return ret;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.