2015-04-30 2 views
0

Упрощенный, У меня есть сущность, назовем его "Foo", в моей базе данных несколько раз.Как выполнить запрос, в том числе Где?

Теперь я хочу, чтобы выбрать определенный Foo s на основе их FooCode (список FooCode с выбирается пользователем).

Скажем, у меня есть пять Foo s, три из которых имеют FooCode"20". Я хочу вернуть список Foo s с FooCode "20"; ожидаемым результатом является список Foo s с размером трех.

Следующая LinQ выражение работает совершенно нормально, хотя он выбирает всеFoo s перед выполнением Where (пожалуйста, поправьте меня, если я ошибаюсь). Таким образом, с большим количеством Foo s это, вероятно, не самое быстрое решение.

// user defined list of FooCodes - now containing: "20", "20", "20" 
List<string> selectedFooCodes = ... 
List<Foo> = _transactionalDataAccess 
       .Query<Foo>(query => query) 
       .Where(entity => selectedFooCodes.Contains(entity.FooCode)).ToList(); 

Я полагаю LinQ выражение в следующем подберет быстрее, потому что Where непосредственно после Query. В любом случае, он возвращает список Foo s размером пять. Насколько я понимаю, должен выбрать точно такой же, как в приведенном выше запросе.

// user defined list of FooCodes - now containing: "20", "20", "20" 
List<string> selectedFooCodes = ... 
List<Foo> = _transactionalDataAccess 
       .Query<Foo>(query => query 
       .Where(entity => selectedFooCodes.Contains(entity.FooCode))); 

Почему это? Может кто-то сказать мне, что мне не хватает. Выше Linq возвращают точно так же, как:

_transactionalDataAccess 
       .Query<Foo>(query => query); 

Почему не Where никакой разницы? Или есть еще более быстрое обозначение, о котором я не знаю?

Прошу прощения, если это было задано ранее. Я просматривал вопросы LinQ в StackOverflow, но не нашел аналогичного вопроса. Должен признать, что я решил задать свой вопрос, потому что ему нужно меньше времени, чем чтение и понимание всех существующих.

+0

Вы можете разместить более подробную информацию о коде? Что такое _transactionalDataAccess? –

+0

@RicardoSilva Это тип 'ITransactionalDataAccess', который сужается до' IQueryDataAccess'. Прошу прощения, это дело от нашей компании. Он в основном просто представляет интерфейс с базой данных (Oracle). Надеюсь, это поможет. Это даже имеет значение? – Alex

+0

Невозможно ответить на этот вопрос, не зная, что такое объект '_transactionalDataAccess'. – Hogan

ответ

1

Я не знаю точно, как работает ваш компонент для доступа к базе данных. Но, похоже, он работает аналогично Linq to Sql или EF. Ваш первый код, кажется, сделать что-то вроде этого:

var searchContent = (from a in dataModel.TableA 
        select a) 
        .ToList() 
        .Where(a => a.ID == 22); 

Теперь второй пример, по-видимому, сделать что-то вроде этого:

var searchContent = (from a in dataModel.TableA 
        select a) 
        .Where(a => a.ID == 22) 
        .ToList(); 

Обратите внимание, что из будет генерировать только один запрашиваемый (это будет не выполнять поиск), а метод Where только увеличивает этот запрос. Но на данный момент запрос еще не выполнен. Запрос будет эффективен только в методе ToList (так что это будет поиск только для записей с идентификатором равным 22 и возврата к списку.

Первый пример выберите ВСЕ itens, монтировать объекты в список (теперь это в вашей памяти компьютера), и из списка он принимает только те объекты, которые ID 22

Смежные вопросы