C#: действительно ли возможно отменить запрос linq2sql?

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

Кроме того, чтобы удалить дубликаты item_type_id, я написал бы функцию, которая проверяет, существует ли этот идентификатор в результате.

В примере:

$storeID = [1000,1001];

$array = [
    0 => [
        "partner_id" => "10017",
        "store_id" => "1000",
        "item_type_id" => "2",
        "value" => "58",
        "category" => "1"
    ],
    1 => [
        "partner_id" => "10017",
        "store_id" => "1000",
        "item_type_id" => "1",
        "value" => "63",
        "category" => "1",
    ],
    2 => [
        "partner_id" => "0",
        "store_id" => "1000",
        "item_type_id" => "3",
        "value" => "29",
        "category" => "1"
    ],
    3 => [
        "partner_id" => "0",
        "store_id" => "1000",
        "item_type_id" => "2",
        "value" => "58",
        "category" => "1",
    ],
    4 => [
        "partner_id" => "0",
        "store_id" => "1001",
        "item_type_id" => "1",
        "value" => "65",
        "category" => "1",
    ],
    5 => [
        "partner_id" => "0",
        "store_id" => "1001",
        "item_type_id" => "2",
        "value" => "58",
        "category" => "1",
    ],
    6 => [
        "partner_id" => "0",
        "store_id" => "1001",
        "item_type_id" => "3",
        "value" => "29",
        "category" => "1"
    ],
    7 => [
        "partner_id" => "0",
        "store_id" => "1000",
        "item_type_id" => "1",
        "value" => "65",
        "category" => "1"
    ]
];

function ItemIdExists($arr, $itemId)
{
    foreach ($arr as $subValue)
    {
        if ($subValue["item_type_id"] == $itemId)
        {
            return true;
        }
    }
    return false;
}

$result = array();
foreach ($array as $value)
{
    $key = $value["store_id"];
    if (in_array($key, $storeID))
    {
        $ItemIdFound = isset($result[$key]) && ItemIdExists($result[$key], $value["item_type_id"]);

        if (!$ItemIdFound)
            $result[$key][] = $value;
    }
}
var_dump($result);

Выход

array(2) {
  [1000]=>
  array(3) {
    [0]=>
    array(5) {
      ["partner_id"]=>
      string(5) "10017"
      ["store_id"]=>
      string(4) "1000"
      ["item_type_id"]=>
      string(1) "2"
      ["value"]=>
      string(2) "58"
      ["category"]=>
      string(1) "1"
    }
    [1]=>
    array(5) {
      ["partner_id"]=>
      string(5) "10017"
      ["store_id"]=>
      string(4) "1000"
      ["item_type_id"]=>
      string(1) "1"
      ["value"]=>
      string(2) "63"
      ["category"]=>
      string(1) "1"
    }
    [2]=>
    array(5) {
      ["partner_id"]=>
      string(1) "0"
      ["store_id"]=>
      string(4) "1000"
      ["item_type_id"]=>
      string(1) "3"
      ["value"]=>
      string(2) "29"
      ["category"]=>
      string(1) "1"
    }
  }
  [1001]=>
  array(3) {
    [0]=>
    array(5) {
      ["partner_id"]=>
      string(1) "0"
      ["store_id"]=>
      string(4) "1001"
      ["item_type_id"]=>
      string(1) "1"
      ["value"]=>
      string(2) "65"
      ["category"]=>
      string(1) "1"
    }
    [1]=>
    array(5) {
      ["partner_id"]=>
      string(1) "0"
      ["store_id"]=>
      string(4) "1001"
      ["item_type_id"]=>
      string(1) "2"
      ["value"]=>
      string(2) "58"
      ["category"]=>
      string(1) "1"
    }
    [2]=>
    array(5) {
      ["partner_id"]=>
      string(1) "0"
      ["store_id"]=>
      string(4) "1001"
      ["item_type_id"]=>
      string(1) "3"
      ["value"]=>
      string(2) "29"
      ["category"]=>
      string(1) "1"
    }
  }
}
5
задан Svish 4 March 2009 в 08:26
поделиться

3 ответа

Так, согласно комментарию Richard Szalay:

Ваш лучший выбор состоит в том, чтобы выполнить запрос в фоновом потоке и просто отказаться от подписки от событий контейнерного объекта, когда пользователь поражает Отмену.

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

Не начали реализовывать это все же (должны закончить некоторые другие вещи сначала), но один способ, которым это могло работать:

  • В рабочем потоке сделайте запросы в отдельном потоке запроса и затем Соединении, которые распараллеливают, пока это не закончено.
  • Когда пользователь поразит отмену, звоните Interrupt метод рабочего потока, который затем добрался бы ThreadInterruptedException и прекратите ожидать потока запроса для окончания.

Может добавить некоторый код позже, когда я делаю его. Но мы будем видеть, как симпатичный это складывается :p

2
ответ дан 15 December 2019 в 06:35
поделиться

Я сказал бы, что необходимо будет, вероятно, выполнить его на отдельном Потоке и отмене это вместо этого.

-1
ответ дан 15 December 2019 в 06:35
поделиться

При установке CommandTimeout (секунды) свойство DataContext это автоматически выдаст исключение после того, как тайм-аут протечет.

2
ответ дан 15 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: