Я перепишу вопрос
У меня есть список (
blockquote>someItems
) объектов с числовыми идентификаторами. Я хочу запросить таблицуPurchasedItems
в моей базе данных, чтобы получить все строки, гдеFK_ItemID
не не соответствуют идентификатору любого из объектов в моем спискеsomeItems
.Мой ответ:
List<Item> someItems = new List<Item>(); // Populate someItems List<int> someItemIDs = someItems.Select(i=>i.ID).ToList(); var filtered = ctx.PurchasedItems .Where(x => !someItemIDs.Contains(x.FK_ItemID)) .ToList();
Как указано в комментарии @juharr, EF не может работать с коллекцией не примитивных типов, потому что пытается преобразовать это в SQL. Вы можете сначала создать коллекцию
someItemIDs
.
Я не использовал его сам, но мне говорят, что библиотеки потока Повышения делают его невероятно легким.
Для Unix/Linux/BSD существует pthread библиотека: учебное руководство.
Я предполагаю, что там эквивалентны в Win32 API.
Я использую tbb_thread класс от Intel, распараллеливающего библиотеку стандартных блоков.
Можно хотеть считать мою более раннюю регистрацию на ТАК.
(В ретроспективе, что регистрация является немного односторонней к pthreads. Но я - вид Unix/Linux парня. И тот подход казался лучшим относительно исходной темы.)
Существуют многие библиотеки потоков, которые совместимы с C++. Так сначала необходимо выбрать тот. Я предпочитаю OpenMP или потоки POSIX (также известный как pthreads). То, как скомпилировать его, зависит от библиотеки, которую Вы имеете, выбирают.
Я пользуюсь библиотекой мой университет, который записал профессор. Очень просто реализовать, и работы действительно хорошо (использовал его в течение достаточно долгого времени теперь). Я спрошу его разрешение совместно использовать его с Вами.
Извините за ожидание вперед, но должен проверить :)
++++++ РЕДАКТИРОВАНИЕ +++++++
Хорошо, таким образом, я говорил со своим профессором, и он не возражает, если я совместно использую его здесь. Ниже.h и .cpp файлы для 'Библиотеки RT', записанной Paul Davies
http://www.filefactory.com/file/7efbeb/n/rt_h
http://www.filefactory.com/file/40d9a6/n/rt_cpp
Некоторые точки, которые будут сделаны о потоках и использовании этой библиотеки:
0) Это учебное руководство объяснит создание потока и использование на платформе окон.
1) Потоки в C++ обычно кодируются как часть того же источника (в отличие от процессов, где каждый процесс имеет свой собственный исходный файл, и функционируйте основные ()),
2) Когда процесс в порядке, он может создать другие потоки путем создания соответствующих Вызовов ядра.
3) Несколько потоков работают быстрее, чем несколько процессов, так как они - часть того же процесса, который приводит к меньшему количеству издержек для ОС и уменьшенных требований к памяти.
4) То, что Вы будете использовать в своем случае, является классом CThread в rt библиотеке.
5) (Удостоверьтесь, rt.h и rt.cpp являются частью Вашего 'решения' и удостоверяются, что включали rt.h в Ваш main.cpp),
6) Ниже часть кода от Вашего будущего основного потока (в main.cpp, конечно), где Вы создадите поток с помощью класса CThread.
void main()
{
CThread t1(ChildThread1, ACTIVE, NULL) ;
. . .
t1.WaitForThread() ; // if thread already dead, then proceed, otherwise wait
}
Аргументы t1 в порядке: Название функции, действующей как наш поток, состояние потока (это может быть или АКТИВНО или ПРИОСТАНОВЛЕНО - в зависимости от того, что Вы хотите), и в последний раз, указатель на дополнительные данные, можно хотеть передать потоку при создании. После того, как Вы выполните некоторый код, Вы захотите назвать WaitForThread () функцией.
7) Ниже часть кода от Вашего будущего основного потока (в main.cpp, конечно), где Вы опишете то, что делает дочерний поток.
UINT _ _stdcall ChildThread1(void *args)
{
. . .
}
Нечетно выглядящей вещью там является подпись потока Microsoft. Я уверен с небольшим количеством исследования, которое можно выяснить, как сделать это в другом OSs. Аргументом являются дополнительные данные, которые могли быть переданы ребенку при создании.
8) Можно найти подробные описания функций членства в rt.cpp файле. Вот сводки:
CThread () - конструктор, ответственный за создание потока
Приостановите () - Приостанавливает дочерний поток, эффективно приостанавливающий его.
Резюме () - Будит приостановленный дочерний поток
SetPriority (международное значение) - Изменения приоритет дочернего потока к значению указан
Сообщение (международное сообщение) - Добавляет сообщение к дочернему потоку
TerminateThread () - Завершает или Уничтожает дочерний поток
WaitForThread () - Приостанавливает родительский поток, пока дочерний поток не завершается. Если дочерний поток уже завершился, родитель не приостановится
9) Ниже пример демонстрационной полной программы. Умная вещь, которую можно сделать, создают несколько инстанцирований единственного потока.
#include “..\wherever\it\is\rt.h” //notice the windows notation
int ThreadNum[8] = {0,1,2,3,4,5,6,7} ; // an array of thread numbers
UINT _ _stdcall ChildThread (void *args) // A thread function
{
MyThreadNumber = *(int *)(args);
for ( int i = 0; i < 100; i ++)
printf( "I am the Child thread: My thread number is [%d] \n", MyThreadNumber) ;
return 0 ;
}
int main()
{
CThread *Threads[8] ;
// Create 8 instances of the above thread code and let each thread know which number it is.
for ( int i = 0; i < 8; i ++) {
printf ("Parent Thread: Creating Child Thread %d in Active State\n", i) ;
Threads[i] = new CThread (ChildThread, ACTIVE, &ThreadNum[i]) ;
}
// wait for threads to terminate, then delete thread objects we created above
for( i = 0; i < 8; i ++) {
Threads[i]->WaitForThread() ;
delete Threads[i] ; // delete the object created by ‘new’
}
return 0 ;
}
10) Вот именно! rt библиотека включает набор классов, который позволяет Вам работать с процессами и потоками и другими параллельными методами программирования. Узнайте остальных ;)