Как динамически запрашивать базу данных, используя LINQ и переменную? - PullRequest
2 голосов
/ 01 апреля 2020

У меня есть таблица базы данных, которая имеет 100 столбцов с метками D1, D2, D3 и т. Д. До 100.

В моем методе (ASP. NET MVC) мне нужно Проверьте, не являются ли эти столбцы нулевыми, прежде чем отображать их в таблице на мой взгляд. Я действительно не хочу этого делать :

if(db.Datatable.Select(x=>x.D1).FirstOrDefault() != null)
{
  //do code
}
if(db.Datatable.Select(x=>x.D2).FirstOrDefault() != null)
{
  //do code
}
if(db.Datatable.Select(x=>x.D3).FirstOrDefault() != null)
{
  //do code
}

Это было бы 100, если бы заявления выглядели просто ужасно. Поэтому я начал этот код здесь:

  for(int i = 1; i < 100; i++)
  {
       var dbField = "D" + i;  //D1,D2,D3....

       var currField = db.Datatable.Select(x => x.dbField).FirstOrDefault();


       //here i would add the value (0 for null, 1 for data) to an array, which i would handle in the view
  }

За исключением LINQ / C# это не нравится. Это, очевидно, вызывает ошибку в dbField в операторе Select. Вы не можете просто установить .Select (x = x.variable). Я читал о создании собственного дерева лямбда-выражений и создании собственного динамического запроса c, есть мысли о том, как это сделать? Как я могу custom создать имя поля для оператора Select? Спасибо.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Нет причин повторно брать первый элемент из одной и той же неизменной коллекции. Просто возьмите первый элемент из коллекции и затем работайте с этим извлеченным объектом:

var element = db.Datatable.FirstOrDefault();

Это уже значительно упрощает ваш код и повышает производительность (потому что вам не нужно повторять по коллекции для каждого свойства):

if(element.D1 != null)
{
    //do code
}

// and so on...

Непонятно точно , почему вам необходимо убедиться, что каждое поле содержит ненулевое значение. Вы никогда не публиковали код, показывающий, как вы собираетесь использовать эти значения.

//here i would add the value (0 for null, 1 for data) to an array, which i would handle in the view

Как правило, лучше просто убедиться, что ваше представление может обрабатывать нули , поскольку это означает, что вы не Вам не нужно беспокоиться о том, что ваш код выполняется, когда определенное значение равно нулю.

Если это невозможно, тогда все же проще просто преобразовать значения null в значение по умолчанию, отличное от нуля. Это означает, что вам по-прежнему не нужно беспокоиться о пустых значениях (после того, как вы их преобразовали), поскольку у вас больше не будет нулевых значений.

Простой способ сделать это - использовать оператор объединения нулей, например,

var firstName = element.D1 ?? String.Empty;

. Это гарантирует, что null значения будут заменены значением по умолчанию (которое вы можете указать, я просто выберите здесь пустую строку, но вы можете выбрать все, что захотите).

Также обратите внимание, что вам даже не нужно делать это для ненулевых значений, таких как int, так как по умолчанию они равны 0 автоматически.

//here i would add the value to an array

Зачем использовать массив вместо объекта? Непонятно, почему вы не можете вручную обрабатывать каждое свойство (и его значение) вместо того, чтобы передавать объект сам по себе, что, несомненно, является лучшим OOP способом передачи данных.

Это противоречит в то же время хочет обрабатывать все данные вручную, а также не хочет обрабатывать все эти данные.

0 голосов
/ 02 апреля 2020

Я думаю, что если вы объясните более точно, что вы хотите сделать, по вашему мнению, мы сможем помочь вам лучше.

Когда я увижу ваш код, я сделаю вывод, что ваша таблица будет отображаться в вашем представлении только одна запись с его соответствующими свойствами / столбцами. Если вы хотите это сделать, все в порядке.

С другой стороны, перебор таблицы в соответствии с количеством столбцов - плохая идея, поскольку вы связываете два уровня абстракции. Я имею в виду, что ваш MVC метод НЕ должен знать количество столбцов, и это то, что вы делаете с "for (int i = 1; i <100; i ++)". Действительно, что произойдет, если произойдет обновление схемы таблицы и число столбцов изменится? То же самое для названия столбцов? Ваш код будет взломан! </p>

Я думаю, что вы принимаете проблему не с той стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...