uCommerce中的LINQ自定义OrderLine字段

时间:2012-12-27 12:45:26

标签: linq umbraco umbraco-ucommerce

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

问题是,并非每个订单行都定义了此自定义字段。如何让LINQ使用未定义的自定义字段跳过订单行,而不是抛出错误。

请参阅以下代码。

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

祝你好运, Brinck10

修改

我使用任何

尝试了以下代码
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

编辑结束

2 个答案:

答案 0 :(得分:1)

我希望我能得到你想要的东西。我已经使用一系列字典模拟了您的PurchaseOrder,我想,您的lambda表达式中的形式参数y来自IDictionary,因为我可以看到这样的表达式{{ 1}}。如果我的假设错了,请纠正我。 解决方案是通过调用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);

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

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

答案 1 :(得分:1)

您可以检查特定的键/值组合,如下所示:

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

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

希望这有帮助。