Nano Hash - криптовалюты, майнинг, программирование

Пользовательские поля строки заказа LINQ в uCommerce

Я пытаюсь подсчитать, сколько строк заказов (ol) имеют настраиваемое поле «distributedOrderLineId», равное идентификатору строки заказов текущей итерации.

Дело в том, что не в каждой строке заказа определено это настраиваемое поле. Как я могу заставить LINQ пропускать строки заказов с неопределенным настраиваемым полем вместо того, чтобы выдавать ошибку.

Пожалуйста, обратитесь к приведенному ниже коду.

var distributionsLeft = ol.Quantity - 1 - PurchaseOrder.All().Where(y => int.Parse(y["distributedOrderLineId"]) == ol.Id).Count();

С уважением, Бринк10

ИЗМЕНИТЬ

Я попробовал следующий фрагмент кода, используя any:

PurchaseOrder.All().Where(y => y.OrderProperties.Any(z=>z.Key=="distributedOrderLineId")).Where(a=>a["distributedOrderLineId"]==ol.OrderLineId.ToString()).Count();

К сожалению, это не работает. Ошибка, которую я получаю в трассировке стека:

[NotSupportedException: System.String get_Item(System.String)]
   NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression) +206

ИЗМЕНИТЬ КОНЕЦ


  • Уточните, какой тип у? Или из какого общего IEnumerable‹T› PurchaseOrder является производным? 27.12.2012

Ответы:


1

Надеюсь, я получил то, что вы хотите. Я смоделировал ваш PurchaseOrder с помощью массива словарей и полагаю, что формальный параметр y в вашем лямбда-выражении является производным от IDictionary, потому что я вижу такое выражение y["distributedOrderLineId"]. Пожалуйста, поправьте меня, если я ошибаюсь в своих предположениях. Решение состоит в том, чтобы проверить, установлен ли ключ, вызвав order.ContainsKey("id"). Вы можете увидеть пример ниже

var firstItem = new Dictionary<string, string>{{"id", "11"}};
var secondItem = new Dictionary<string, string>{{"id", "12"}};
var thirdItem = new Dictionary<string, string>(); // id is not set, as distributedOrderLineId in your example
var fourthItem = new Dictionary<string, string>{{"id", "14"}};

var PurchaseOrder = new [] {firstItem, secondItem, thirdItem, fourthItem};
var quantity = 4;
var orderID = 12;
var distributionsLeft = quantity - 1 - PurchaseOrder.Where(order => order.ContainsKey("id") && int.Parse(order["id"]) == orderID).Count();

Console.WriteLine (distributionsLeft);

Изменить: не могли бы вы попробовать использовать следующий запрос, просто чтобы посмотреть, работает ли он? Затем мы можем попытаться выполнить некоторую оптимизацию, если она работает нормально.

PurchaseOrder.Where(y => y.OrderProperties.Any(z => z.Key == "distributedOrderLineId"))
             .ToList()
             .Where(y => y["distributedOrderLineId"] == ol.OrderLineId.ToString())
             .Count();

Оптимизированная версия: я попытался оптимизировать приведенную выше версию с точки зрения производительности и удобочитаемости, но обратите внимание: я могу ошибаться, потому что я не запускал этот запрос. Я изменил его, только проанализировав документацию uCommerce относительно OrderLine и OrderProperty. Также обратите внимание, что я использовал разные имена для формальных параметров в лямбда-выражениях — просто чтобы избавиться от путаницы с y и z.

string orderLineId = ol.OrderLineId.ToString();
PurchaseOrder
    .Count(order => order.OrderProperties.Any(property => property.Key == "distributedOrderLineId" && property.Value == orderLineId));
27.12.2012
  • Илья, вы понимаете, что я выбираю, однако настраиваемое поле является частью класса OrderLine (ссылка: ucommerce.dk/docs/html/T_UCommerce_EntitiesV2_OrderLine.htm) и не содержит метод ContainsKey. Любое другое предложение? 27.12.2012
  • Что он возвращает или делает, если вы передаете y[distributedOrderLineId] и этот идентификатор не установлен? 27.12.2012
  • Проблема в том, что я даже не создал настраиваемое поле DistributedOrderLineId во многих строках заказов. Я хочу проверить в том же предложении where, если такое поле существует, и если оно существует, то сравнить удостоверения. 27.12.2012
  • Не могли бы вы попробовать использовать запрос, указанный после редактирования в ответе? Пожалуйста, ответьте, работает или нет? Жаль, я не могу воспроизвести вашу ситуацию на своей машине, поэтому я просто пытаюсь понять, в чем проблема. 28.12.2012
  • Илья, код, который ты написал под редактированием, сработал! Можем ли мы тогда оптимизировать его? 29.12.2012
  • Должны ли мы? Я пытался изменить запрос на более оптимальное решение, но обратите внимание - это не сработало. Я не люблю давать такие ответы, потому что риск ошибиться слишком высок, но я попытался оптимизировать как производительность, так и читабельность. Не стесняйтесь отвечать мне, если запрос в разделе «оптимизированная версия» сработал. Кстати - с Рождеством) 31.12.2012
  • К сожалению, я не мог использовать count в начале. Я перефразировал ваш код на следующий рабочий мир PurchaseOrder.All().Where(y => y.OrderProperties.Any(z => z.Key == "distributedOrderLineId")).ToList().Where(a => a["distributedOrderLineId"] == ol.OrderLineId.ToString()).Count() 01.01.2013
  • Спасибо за вашу помощь и счастливого нового года! 01.01.2013

  • 2

    Вы можете проверить наличие определенной комбинации ключ/значение следующим образом:

    bool anyLinesWithKeyValue = purchaseOrder.OrderLines.Any(x => x.OrderProperties.Any(y => y.Key == "distributedOrderLineId" && y.Value == "someValue"));
    

    Это просто даст вам «да» или «нет» о том, есть ли какие-либо настоящие строки, в которых есть эта комбинация. Если вам нужны строки заказа для чего-то, просто замените «Любой» на «Где».

    Надеюсь это поможет.

    02.01.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..