Можно ли использовать строку для выражения запроса LINQ? - PullRequest
7 голосов
/ 27 июля 2011

Мне нужно извлечь некоторые записи, если некоторые переменные имеют некоторые значения.

Например, если статус> 0, мне нужно отфильтровать результат как:

where object.id=status

else, если status =0, мне нужно удалить это, где предложения и вернуть все элементы.Я избавлюсь от:

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 ]

8 голосов
/ 27 июля 2011

Поскольку LINQ ленив, вы можете просто сделать

var query = ...

if (status > 0)
{
    query = query.Where(o => o.id == status);
}
3 голосов
/ 27 июля 2011

Это возможно с помощью Dynamic LINQ, см. Сообщение в блоге ScottGu: Dynamic LINQ (Часть 1. Использование библиотеки динамических запросов LINQ)

enter image description here

3 голосов
/ 27 июля 2011

Вы можете создать запрос следующим образом:

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

Это помогает?

2 голосов
/ 27 июля 2011

Вы можете сделать это следующим образом:

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

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

Linq (для sql и EF) достаточно умен, чтобы объединить условия where и отправить один оператор SQL в базу данных.

1 голос
/ 27 июля 2011

Вы пытаетесь выполнить условный запрос 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();
1 голос
/ 27 июля 2011

Другой вариант: query.Where(x=>(status>0? x.id==status : 1==1))

1 голос
/ 27 июля 2011

AFAIK, вам нужно иметь 2 разных запроса.

if(status > 0)
{
    var myquery = From ....
    where object.id = status
}
else
{
    var myquery = From ..
}
1 голос
/ 27 июля 2011

Вы можете написать следующее

IQueryable<T> query = dbContext.SomeObjectSet;

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

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

Однако, если вы хотите запросить все объекты, вы можете отфильтровать их в памяти впоследствии, используя LINQ to SQL

1 голос
/ 27 июля 2011

Это возможно с помощью динамического linq - см. Как создать LINQ Query из строки?

Мой ответ там - ссылки на посты Скотта Гу и пример кода от Microsoft - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

...