我是使用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;
}
我认为我没有为if语句正确获取OrderLineQty
值,因为它会生成以下错误:
System.InvalidCastException: Unable to cast object of type 'WhereSelectListIterator`2[Invoice,System.Double]' to type 'System.IConvertible'.
有人可以帮我理解如何在LiNQ查询中使用返回的值吗?
LiNQ需要一段时间才能沉入其中!
答案 0 :(得分:1)
直到“used”才会评估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();
答案 1 :(得分:0)
这是因为如果IEnumerable<T>
是int,则返回OrderLineQty
,则invoiceQty的类型为IEnumerable<int>
。
进行比较时,这没有任何意义。
如果您只想要一个结果,请使用.Single()
here
答案 2 :(得分:0)
Linq就像一个SQL查询,如果你熟悉它。在您的代码中,invoiceQty将包含符合您在where子句中的搜索条件的i.OrderLineQty的LIST(更具体地说,IQueryable)。即使只有一个匹配,它仍然会给你一个包含一个元素的列表。
你肯定知道只有一个匹配(并且where子句似乎支持这个假设),所以如果你的情况你可以请求Single,First,SingleOrDefault或FirstOrDefault(click here为一个完整的可用方法列表)
if (Convert.ToInt32(txtReturnProdQty.Text) > Convert.ToInt32(invoiceQty.First()))
答案 3 :(得分: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;
}