是否可以使用字符串作为LINQ查询表达式?

时间:2011-07-27 15:37:47

标签: c# linq expression

如果某些变量有一些值,我需要提取一些记录。

例如,如果状态> 0,我需要过滤结果,如:

where object.id=status

否则,如果status = 0,我需要删除where where子句并返回所有元素。我会摆脱:

if(status>0)
   do a linq query with the where clauses
else
   do a link query with that where clauses

代码太多,因为要检查的变量可能超过4-5。

是否可以在LINQ上“注入”一种字符串? (所以我可以创建我的字符串并将其传递给LINQ)。

我的意思是:

string myQuery="";
if(status>0)
   myQuery="where object.id=status";
else
   myQuery="";

有可能吗? (经典的mysql行为)。

9 个答案:

答案 0 :(得分:8)

由于LINQ很懒,你可以做到

var query = ...

if (status > 0)
{
    query = query.Where(o => o.id == status);
}

答案 1 :(得分:3)

您可以建立如下查询:

IEnumerable<MyEntity> results = MyEntityContext.MyEntities;
if (status > 0)
    results = results.Where(e => e.id == status);

这有帮助吗?

答案 2 :(得分:3)

可以使用Dynamic LINQ,请参阅ScottGu的博客文章: Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

enter image description here

答案 3 :(得分:2)

你可以这样做:

  var query = database.MyTable.Where(/* where for all records */);

  if (status > 0) {
      query = query.Where(o => o.id == status);
  }

Linq(对于sql和EF)非常聪明,可以合并where条件并将一条SQL语句发送到数据库。

答案 4 :(得分:1)

可以使用动态linq - 请参阅How to create LINQ Query from string?

我的回答链接到Scott Gu的帖子和Microsoft的示例代码 - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

答案 5 :(得分:1)

您可以写下以下内容

IQueryable<T> query = dbContext.SomeObjectSet;

if (condition1) {
    query = query.Where(...)
}

if (condition2) {
    query = query.Where(...)
}

但是,您要查询所有实体,之后可以使用LINQ to SQL

在内存中进行过滤

答案 6 :(得分:1)

AFAIK,您需要有2个不同的查询。

if(status > 0)
{
    var myquery = From ....
    where object.id = status
}
else
{
    var myquery = From ..
}

答案 7 :(得分:1)

另一种选择:query.Where(x=>(status>0? x.id==status : 1==1))

答案 8 :(得分:1)

您是否尝试进行条件LINQ查询?如果是这样可能会有所帮助

var nums = new List<int>() { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 };
bool getOdd = true;

var query = nums.AsQueryable();

if (getOdd) {
    query = query.Where(i => i == 1 || i == 3);
} else {
    query = query.Where(i => i == 2 || i == 4);
}

var result = query.ToList();