Я работаю над приложением MVC. Многие из них - поисковая система, позволяющая пользователю выбирать параметры для получения желаемых данных.MVC Эффективные динамические вызовы базы данных EF
Я ищу эффективный способ динамических вызовов в базу данных, чтобы я мог получать только нужные данные вместо того, чтобы брать кучу данных и сортировать их.
До сих пор я использовал Dynamic Linq, но у меня были огромные проблемы с этим, и мне было интересно, было ли что-то лучше и менее хлопотно. Единственным фактором является то, что я знаю поля таблицы, которую я ищу, и мне нужно иметь возможность использовать таких операторов, как >
, <
или =
.
EDIT
Вот пример таблицы на основе моего приложения:
TABLE CARD
(
CARD_IDE INT NOT NULL IDENTITY,
CARD_NAME VARCHAR(50) NOT NULL,
CARD_NUMBER NUMERIC(4) NOT NULL,
CARD_COLOR VARCHAR(10),
CARD_MANA_COST VARCHAR(30),
CARD_MANA_CONVT VARCHAR(3),
CARD_TYPE VARCHAR(50),
CARD_POWER VARCHAR(2),
CARD_TOUGH VARCHAR(2),
CARD_RARTY VARCHAR(1) NOT NULL,
CARD_TEXT_ABILT VARCHAR(800),
CARD_TEXT_FLAVR VARCHAR(800),
CARD_ARTST_NAME VARCHAR(100),
CARD_SET_IDE INT NOT NULL,
CARD_FLAG_FACE INT NOT NULL DEFAULT 0,
CARD_CHILD_IDE INT,
CARD_MASTER_IDE INT,
CARD_UNIT_COST NUMERIC(5,2) NOT NULL DEFAULT 0
)
И несколько примеров:
- пользователь ищет любой предмет, какой тип является
"Creature" (String),
число является3
и набор карт IDE:6
; - Фотографии, содержащие слово
Rat
; - Все карты
color
Blue
иWhite
которого стоимость единицы являетсяhigher than 3.00
- Любые карты, которые
power
меньше, чем3
но выше, чем1
.
EDIT 2
После долгих исследований (и благодаря Прэтт ниже), мне удалось посмотреть немного и погружение во что-то.
на основе this:
Сначала я создаю свой контекст объекта, как это:
var objectContext = ((IObjectContextAdapter) mDb).ObjectContext;
Тогда я создать ObjectSet:
ObjectSet<CARD> priceList = objectContext.CreateObjectSet<CARD>();
Затем я проверяю, если какие-либо значения, как были выбраны от пользователя:
if (keyValuePair.Key == CARDNAME)
{
queryToLoad = TextBuilder.BuildQueryStringForTextboxValue(keyValuePair.Value);
//valuesToUse.Add("CARD_NAME.Contains(\"" + queryToLoad + "\")");
priceList = priceList.Where(_item => _item.CARD_NAME.Contains(queryToLoad)) as ObjectSet<PRICE_LIST>;
}
Где queryToLoad - это, по сути, значение, которое нужно искать. Пример: если мой пользователь ищет Ангел, queryToLoad будет «Ангел». Я пытаюсь получить результат без необходимости переписывать весь код.
А потом собрать результат в списке, как это:
listToReturn.AddRange(priceList.ToList());
ОДНАКО: У меня есть проблема с использованием этого подхода. Поскольку priceList = priceList.Where(_item => _item.CARD_NAME.Contains(queryToLoad)) as ObjectSet<PRICE_LIST>;
нравится, это значение всегда null, и я не знаю почему.
Можно привести примеры, которые более конкретны, если вы предоставите некоторый код. – mostruash
Я поставлю стол и несколько примеров, чтобы он стал конкретным. – hsim
Добавлен код. У вас есть вопросы? – hsim