1

我正在尝试计算有多少订单行(ol)的自定义字段“distributedOrderLineId”等于当前迭代的订单行 ID。

问题是,并非每个订单行都定义了这个自定义字段。如何使 LINQ 跳过带有未定义自定义字段的订单行,而不是引发错误。

请参考下面的代码。

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

最好的问候, Brinck10

编辑

我使用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

编辑结束

4

2 回答 2

1

我希望我已经得到了你想要的。我PurchaseOrder用一系列字典模拟了你,我想y你的 lambda 表达式中的形式参数是从 派生的IDictionary,因为我可以看到这样的表达式y["distributedOrderLineId"]。如果我的假设有误,请纠正我。解决方法是通过调用来检查是否设置了key 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();

优化版本:我尝试从性能和可读性的角度优化上面给出的版本,但请注意 - 我错了,因为我没有运行该查询。我仅通过分析有关OrderLineOrderProperty的 uCommerce 文档来更改它。另请注意,我在 lambdas 中为形式参数使用了不同的名称——只是为了摆脱 y 和 z 的混乱。

string orderLineId = ol.OrderLineId.ToString();
PurchaseOrder
    .Count(order => order.OrderProperties.Any(property => property.Key == "distributedOrderLineId" && property.Value == orderLineId));
于 2012-12-27T14:37:38.733 回答
1

您可以像这样检查特定的键/值组合:

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

这只会给你一个“耶”或“不”关于是否有任何具有该组合的实际行。如果您需要某些东西的订单行,只需将“Any”替换为“Where”。

希望这可以帮助。

于 2013-01-02T13:53:06.563 回答