从LiNQ查询获得结果

时间:2013-02-27 16:17:12

标签: c# asp.net linq

我是使用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需要一段时间才能沉入其中!

4 个答案:

答案 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;
}