Member 13058758 Ответов: 2

Как выполнить поиск в базе данных по имени столбца в MVC


public ActionResult Search(string column , string parameter)
        {

            var search = db.EmpDatas.Where(p => p.JobTitle.Contains(parameter));      
            
            return View("insurance", search.ToList());
           
        }


это мой код, я хочу поставить параметр "column" вместо "JobTitle" , который находится в состоянии where

это означает, что пользователь выполняет поиск по имени столбца и данным в этом столбце и получает список

Что я уже пробовал:

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'EmpDatas' and COLUMN_NAME = 'JobTitle'


я этот SQL-запрос в SQL сервер поставить я не знаю хо я положил его в контроллер MVC

2 Ответов

Рейтинг:
2

Richard Deeming

Вам нужно будет построить динамическое выражение. Добавить using директива для Система.Linq.Выражения[^] пространство имен.

private static Expression<Func<TEntity, bool>> BuildDynamicSearchFilter<TEntity>(string column, string value)
{
    var p = Expression.Parameter(typeof(TEntity), "p");
    
    var propertyToSearch = Expression.Property(p, column);
    if (propertyToSearch.Type != typeof(string))
    {
        throw new ArgumentException($"Column '{column}' is a {propertyToSearch.Type}, and cannot be searched", nameof(column));
    }
    
    var containsMethod = typeof(string).GetMethod(nameof(string.Contains), new[] { typeof(string) });
    var valueToFind = Expression.Constant(value);
    var body = Expression.Call(propertyToSearch, containsMethod, valueToFind);
    return Expression.Lambda<Func<TEntity, bool>>(body, p);
}

public ActionResult Search(string column, string parameter)
{
    // TODO: Check that this is the correct model type:
    var filter = BuildDynamicSearchFilter<EmpData>(column, parameter);
    var search = db.EmpDatas.Where(filter);
    return View("insurance", search.ToList());
}


Рейтинг:
1

MadMyche

Это один из тех запросов, который просто заставляет меня хотеть покачать головой; так как вы ищете COLUMN_NAME, который вы уже знаете.
2 варианта для результата этого запроса либо будут следующими НУЛЕВОЙ или имя столбца имя которого вы ищете

SELECT COLUMN_NAME
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME  = N'EmpDatas'
AND    COLUMN_NAME = N'JobTitle'
Это просто не имеет смысла для меня, когда сравнивается с вызовом C#, который выглядит как поиск EmpData таблица для сотрудника, имеющего должность, содержащую текст, содержащийся в параметр.
var search = db.EmpDatas.Where(p => p.JobTitle.Contains(parameter));
То, что я думаю, думаю, что вы на самом деле хотите для запроса, это
SELECT *
FROM   EmpDatas
WHERE  JobTitle LIKE '%parameter%'


Member 13058758

Нет, я хочу, чтобы поиск с именем столбца, а не должность |установить параметр

MadMyche

Задумывались ли вы о создании модели на основе этой таблицы информационной схемы?

Member 13058758

У меня есть модель, как я ее использую ?

MadMyche

Для начала я хотел бы посмотреть, как ваши другие модели (например, EmpData) и контроллеры работают с БД

Member 13058758

я работаю с entity framework, я не понимаю, что вы имеете в виду с тем, как работают другие модели ?

MadMyche

Тогда вам нужно будет научиться либо:
1. Добавление новых моделей с помощью добавления в Entity Framework
2. Добавьте модели и подключения к базе данных вручную.

Оба из них требуют больше, чем позволяет "быстрый ответ", и потребовали бы больше учебника, если вы не понимаете основных понятий