在LINQ到实体查询动态条件 [英] Dynamic conditions in Linq-to-Entities query
问题描述
我试图将一些旧的代码,直接生成SQL查询实体框架,并在许多似乎有问题(从众多的问题来看围绕着这一话题)传来:如何表达动态where条件在LINQ
I'm trying to convert some old code that directly builds SQL queries to Entity Framework, and came across a problem that many seem to have (judging from the large number of questions surround that topic): how to express dynamic where conditions in linq.
我怎么能表达对LINQ查询下面的代码:
How could I express the following code with a linq query:
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扩展在其他职位,但我认为这是一个简单的情况下可能是没有外部库可解的。
I've read about PredicateBuilder
and the dynamic Linq extensions in other posts, but I think that a simple case like could be solvable without external libraries.
使用.NET 4.5,EF 5.0,C#,可这是在动态的方式没有建立完整的LINQ语句给每个单独的情况下做了什么?
Using .net 4.5, EF 5.0, C#, can this be done in a "dynamic" way without building the complete linq statement for each single case?
推荐答案
如果你不想使用外部的东西,然后只需用流利的API:
If you don't want to use something external, then simply use 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 的您可以创建按状态过滤的扩展方法。和您的查询将如下:
BTW You can create extension method for filtering by status. And your query will look like:
var query = db.YourTableName
.FilterByStatus(status)
.Where(x => x.desc.Contains(strsearch))
.OrderByDescending(x => x.date)
.Take(10);
扩展方法:
Extension method:
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);
}
}
这篇关于在LINQ到实体查询动态条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!