我正在尝试将一些直接构建 SQL 查询的旧代码转换为实体框架,并遇到了许多人似乎都遇到的问题(从围绕该主题的大量问题来看):如何在 linq 中表达动态 where 条件。
我如何用 linq 查询表达以下代码:
switch (status) {
case "0":
sqlwhere = " WHERE status < 0 ";
break;
case "-1":
sqlwhere = " WHERE status = -1 ";
break;
case "-100":
sqlwhere = " WHERE status = -100 ";
break;
case "1":
default:
sqlwhere = " WHERE status >= 0 ";
break;
}
if (strsearch != "")
sqlwhere += " AND desc LIKE '%" + strsearch + "%' ";
string sqlc = "SELECT top 10 * FROM c " + sqlwhere + " order by date desc";
我读过关于PredicateBuilder
以及其他帖子中的动态 Linq 扩展,但我认为像这样的简单情况可以在没有外部库的情况下解决。
使用 .net 4.5、EF 5.0、C#,是否可以以“动态”方式完成此操作,而无需为每个案例构建完整的 linq 语句?
如果你不想使用外部的东西,那么只需使用 Fluent API:
var query = db.YourTableName
.Where(x => x.desc.Contains(strsearch));
switch (status) {
case "0":
query = query.Where(x => x.status < 0);
break;
case "-1":
query = query.Where(x => x.status == -1);
break;
case "-100":
query = query.Where(x => x.status == -100);
break;
case "1":
default:
query = query.Where(x => x.status >= 0);
break;
}
var result = query.OrderByDescending(x => x.date)
.Take(10);
BTW您可以创建按状态过滤的扩展方法。您的查询将如下所示:
var query = db.YourTableName
.FilterByStatus(status)
.Where(x => x.desc.Contains(strsearch))
.OrderByDescending(x => x.date)
.Take(10);
扩展方法:
public static IQueryable<YourType> FilterByStatus(this IQueryable<YourType> query,
string status)
{
switch (status) {
case "0":
return query.Where(x => x.status < 0);
case "-1":
return query.Where(x => x.status == -1);
case "-100":
return query.Where(x => x.status == -100);
case "1":
default:
return query.Where(x => x.status >= 0);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)