Как создать динамический запрос для цикла? - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу создать запрос динамически на основе введенного числа и сделать его равным массиву , чтобы получить данные из представления, поэтому я могу создать условие для его фильтрации, но мой запрос работает только для 3 введенные номера.

var query = from bs in dc.VwResourceAssignments select bs;

var listReqNumber = new[] {123, 456, 789};

Мой текущий запрос:

if (listReqNumber.Length == 1)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]));
}
else if (listReqNumber.Length == 2)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
                             p.RequisitionNumber.Contains(listReqNumber[1]));
}
else if (listReqNumber.Length == 3)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
                             p.RequisitionNumber.Contains(listReqNumber[1]) ||
                             p.RequisitionNumber.Contains(listReqNumber[2]));
}

Есть ли способ сделать это динамически, чтобы я мог ввести номер заявки столько, сколько я хочу?

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Давайте обобщим проблему: если у нас есть произвольный listReqNumber массив, который мы хотим реализовать

query = query.Where(
   p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
        p.RequisitionNumber.Contains(listReqNumber[1]) || 
        ...
        p.RequisitionNumber.Contains(listReqNumber[listReqNumber.Length - 1])
);

или - давайте избавимся от || - мы хотим, чтобы any item req with listReqNumber содержался в p.RequisitionNumber

 // doesn't compile - just the idea   
 query = query.Where(p => p.RequisitionNumber.Contains(any req in listReqNumber));

Жаль, мы не можем поставить any req in listReqNumber, но мы можем swap listReqNumber и p.RequisitionNumber и, наконец, правильный запрос:

 query = query.Where(p => listReqNumber.Any(req => p.RequisitionNumber.Contains(req)));
0 голосов
/ 10 декабря 2018
var data = query.Where(q =>
  q.RequisitionNumber.Any(w => listReqNumber.Contains(w))
);
0 голосов
/ 10 декабря 2018

Вы можете использовать динамический linq.Ссылка здесь: https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library

, затем используйте функцию, подобную приведенной ниже:

string GetQuery(int num)
{
    return $"p.RequisitionNumber.Contains(listReqNumber[{num}])";
}

Создайте запрос, как показано ниже в Main:

string testQuery = string.Empty; // or use StringBuilder then convert to string.
int length = 4;
for (int temp = 1; temp <= length; temp ++)
     testQuery += testQuery.Length == 0 ? GetQuery(temp - 1) : " || " + GetQuery(temp);

, затем используйте динамический linqкак:

var query = northwind.Products
                         .Where(testQuery).OrderBy("SupplierID");
0 голосов
/ 10 декабря 2018

Как насчет, если вы используете прямо так:

var result = from p in query where listReqNumber.Contains(p.RequisitionNumber) select p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...