1

カスタムフィールド「distributedOrderLineId」が現在の反復のオーダーライン ID と等しいオーダーライン (ol) の数を数えようとしています。

問題は、すべてのオーダーラインにこのカスタム フィールドが定義されているわけではないということです。エラーをスローする代わりに、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が、ラムダ式の仮パラメーターはから派生して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();

最適化されたバージョン:パフォーマンスと読みやすさの観点から上記のバージョンを最適化しようとしましたが、そのクエリを実行していないため、間違っていることに注意してください。OrderLineおよびOrderPropertyに関する uCommerce ドキュメントを分析することによってのみ変更しました。また、ラムダの仮パラメータに別の名前を使用していることにも注意してください - 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 に答える