Как выбрать информацию из Mysql

254
21 января 2017, 09:38

Есть у меня форма на стороне клиента с двумя выпадющими меню, он там выбирает год и тип обложки.

В контроллере я собираю эти данные.И из исходя из этого делаю запрос в таблицу.Логично, если ничего не выбрано, то я данные подгружаю все.

string sql_count = string.Format("SELECT count(*) FROM labirint");
string sql_pages = string.Format(" ORDER BY id ASC LIMIT "+ skip +", 10");
string sql_all = string.Format("SELECT * FROM labirint");
string sql_result = string.Format(sql_all + sql_pages);
 var v = dc.Database.SqlQuery<labirint>(sql_result).AsQueryable();
 recordsTotal = dc.Database.SqlQuery<int>(sql_count).First();
 var data = v.ToList();
 dc.Dispose();
 return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data },
                    JsonRequestBehavior.AllowGet);

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

        if (!string.IsNullOrEmpty(year))
        {
            int year_int = int.Parse(year);
            string sql_year = string.Format(" WHERE year = " + year_int + "");
            sql_result = string.Format(sql_all + sql_year + sql_pages);
            sql_count = string.Format(sql_count + sql_year);
        }

В итоге получается вот так

string sql_count = string.Format("SELECT count(*) FROM labirint");
string sql_pages = string.Format(" ORDER BY id ASC LIMIT "+ skip +", 10");
string sql_all = string.Format("SELECT * FROM labirint");
string sql_result = string.Format(sql_all + sql_pages);

            if (!string.IsNullOrEmpty(year))
        {
            int year_int = int.Parse(year);
            string sql_year = string.Format(" WHERE year = " + year_int + "");
            sql_result = string.Format(sql_all + sql_year + sql_pages);
            sql_count = string.Format(sql_count + sql_year);
        }
 var v = dc.Database.SqlQuery<labirint>(sql_result).AsQueryable();
 recordsTotal = dc.Database.SqlQuery<int>(sql_count).First();
 var data = v.ToList();
 dc.Dispose();
 return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data },
                    JsonRequestBehavior.AllowGet);

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

Answer 1
 var where = new List<string>();
 var query_params = new List<SqlParameter>();
 var limit_sql = "LIMIT @skip, 10";
 query_params.Add(new SqlParameter("@skip", int.Parse(skip)));
 if (!string.IsNullOrEmpty(year))
 {
     where.Add("year = @year");
     query_params.Add(new SqlParameter("@year", int.Parse(year)));
 }
 if(условие)
 {
    where.Add(...);
    query_params.Add(...);
 }
var whereSql = where.Any() ? " WHERE " + string.Join(" AND ", where) : "";
var sql_result = select_sql + where_sql + order_sql + limit_sql;
var data = dc.Database.SqlQuery<labirint>(sql_result, query_params.ToArray()).ToList();
Answer 2

После WHERE year = " + year_int + "" должно быть AND oblojka = 'tverdaya'. Но лучше все же не писать SQL-запросы самому, используйте ORM или, если это слишком медленно для вас, хотя бы DbExtensions или что-то легковесное типа Dapper

READ ALSO
SelectedItem в ListView

SelectedItem в ListView

Добрый день, есть коллекция которая заполняется из базы MySQL:

265
Форма блокируется потоком

Форма блокируется потоком

C# WinFormThread запускается и работает, но блокирует все элементы формы

361
Поиск элемента в файле

Поиск элемента в файле

Есть txt - файл вида: [Володя_Синяк #1 Охранник 5 лет], в котором #1 это номер отделаЗадача заключается в том, чтобы при вводе нужного отдела сортировало...

291