2012-12-27 28 views
1

我試圖計算有多少個有自定義字段「distributedOrderLineId」的orderlines(ol)等於當前迭代的orderline id。LINQ在uCommerce中的自定義OrderLine字段

問題是,並非每一個訂單行都有這個自定義字段的定義。我如何讓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

指定y的類型是什麼?或從通用IEnumerable 購買PurchaseOrder? –

回答

1

我希望我已經得到你想要的東西。我用一系列字典模擬了你的PurchaseOrder,我想,你的lambda表達式中的形式參數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(); 

優化版本:我試圖優化但從性能和可讀性點上面給出的版本,但要注意 - 我冷是錯的,因爲我還沒有運行該查詢。我只是通過分析關於OrderLineOrderProperty的uCommerce文檔來更改它。還要注意,我在lambda表達式中使用了不同的形式參數 - 只是爲了擺脫y和z的混亂。

string orderLineId = ol.OrderLineId.ToString(); 
PurchaseOrder 
    .Count(order => order.OrderProperties.Any(property => property.Key == "distributedOrderLineId" && property.Value == orderLineId)); 
+0

伊利亞,你明白我選擇什麼,但是,自定義字段是** OrderLine **類的一部分(參考:http://www.ucommerce.dk/docs/html/T_UCommerce_EntitiesV2_OrderLine。htm)並且不包含方法** ContainsKey **。任何其他建議? –

+0

如果您傳遞y [「distributedOrderLineId」]並且此標識未設置,它會返回或執行什麼操作? –

+0

問題是,我甚至沒有在許多訂單行中創建distributedOrderLineId自定義字段。我想檢查相同的where子句,如果這個字段存在,並且它確實比較了身份。 –

1

您可以檢查特定的鍵/值組合,像這樣:

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

那將只是給你一個「耶」或「否」上是否有任何實際的線有那個組合。如果您需要訂單項,只需將「Any」替換爲「Where」即可。

希望這會有所幫助。