1

LiNQを初めて使用します。請求書オブジェクトの部品の注文数量を見つけるために使用される次のコードがあります。

var invoiceQty = from i in returnInvoices
                 where i.PartNo == returnPart.PartNo && i.InvoiceID == hiddenInvoiceId.Value
                 select i.OrderLineQty;

if (Convert.ToInt32(txtReturnProdQty.Text) > Convert.ToInt32(invoiceQty))
{
    args.IsValid = false;
    SourceValidate.ErrorMessage = "Returned qty cannot be greater than quantity available on the invoice.";
    txtReturnProdQty.Focus();
    return;
}

OrderLineQty次のエラーが生成されるため、if ステートメントの値を正しく取得しているとは思いません。

System.InvalidCastException: Unable to cast object of type  'WhereSelectListIterator`2[Invoice,System.Double]' to type 'System.IConvertible'.

LiNQ クエリで返された値を使用する方法を理解できる人はいますか?

LiNQ が慣れるまでに時間がかかります。

4

4 に答える 4

1

linq 式は、「使用」されるまで評価されません。

これは、invoiceQty.ToList() または .First() を呼び出すことを意味します。

それまでは、invoiceQty 型は「式」であり、有効な型ではありません。必要な合計数量を取得するには:

invoiceQty.Sum()

または単にクエリを置き換えます。

var invoiceQty = (from i in returnInvoices
                 where i.PartNo == returnPart.PartNo && i.InvoiceID == hiddenInvoiceId.Value
                 select i.OrderLineQty).Sum();
于 2013-02-27T16:23:37.900 に答える
0

これは、 が int の場合、invoiceQty のタイプが を返しているIEnumerable<T>ためOrderLineQtyですIEnumerable<int>

これは、比較を行うときに意味がありません。

1 つの結果のみを期待する場合は、.Single() ここで使用します

于 2013-02-27T16:24:09.483 に答える
0

Linq は SQL クエリのようなものです。コードでは、invoiceQty に where 句の検索基準を満たす i.OrderLineQty の LIST (具体的には IQueryable) が含まれます。一致するものが 1 つしかない場合でも、要素が 1 つのリストが返されます。

確実に 1 つだけが一致することがわかっているように見えます (そして、where 句はその仮定をサポートしているようです)。そのため、場合によっては、Single、First、SingleOrDefault、または FirstOrDefault を要求できます (使用可能なメソッドの完全なリストについては、ここをクリックしてください)。

if (Convert.ToInt32(txtReturnProdQty.Text) > Convert.ToInt32(invoiceQty.First()))
于 2013-02-27T16:24:26.587 に答える
0

この方法を試してください:

if (invoiceQty.FirstOrDefault() != null) return;

if (Convert.ToInt32(txtReturnProdQty.Text) > (decimal)invoiceQty.First())
{
    args.IsValid = false;
    SourceValidate.ErrorMessage = "Returned qty cannot be greater than quantity available on the invoice.";
    txtReturnProdQty.Focus();
    return;
}
于 2013-02-27T17:51:55.820 に答える