我正在尝试计算自定义字段“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
编辑结束
答案 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);
优化版:我已尝试从性能和可读性的角度优化上面给出的版本,但请注意 - 我感冒了,因为我还没有运行该查询。我只是通过分析有关OrderLine和OrderProperty的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”。
希望这有帮助。