2013-02-27 4 views
1

Я новичок в использовании 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; 
} 

Я не думаю, что я правильно получаю значение OrderLineQty для если утверждение, так как он генерирует следующее сообщение об ошибке:

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

Может кто-нибудь помочь мне понять, как использовать возвращаемое значение в запросе LiNQ?

LiNQ занимает некоторое время, чтобы утонуть!

+0

[выпуск] напоминает формат [1] [1]: http://stackoverflow.com/questions/792412/unable-to-cast-object-of-type-system-data-linq-dataquery1system-int32-to-ty Возможно, вы являетесь получение нескольких значений – user1964763

ответ

1

Выражение linq не оценивается до "used".

Это означает, т.е. вызова invoiceQty.ToList (или) .Первый()

До этого типа invoiceQty является «выражение», а не эффективный тип. Чтобы получить общее количество вам нужно:

invoiceQty.Sum() 

или просто заменить запрос:

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

Это потому, что вы возвращаете IEnumerable<T>, если OrderLineQty является INT, то invoiceQty имеет тип IEnumerable<int> ,

Это бессмысленно, когда вы проводите сравнение.

Если вы ожидаете только один результат, то используйте .Single()here

0

Linq походит на запрос SQL, если вы знакомы с этим. В вашем коде invoiceQty будет содержать СПИСОК (точнее, IQueryable) i.OrderLineQty, который соответствует вашим критериям поиска в предложении where. Даже если есть только один, который соответствует, он все равно предоставит вам список с одним элементом.

Вы точно знаете, что только один будет соответствовать (и предложение where, похоже, поддерживает это предположение), поэтому, если ваше дело вы можете запросить Single, First, SingleOrDefault или FirstOrDefault (click here для полного списка методов доступно)

if (Convert.ToInt32(txtReturnProdQty.Text) > Convert.ToInt32(invoiceQty.First())) 
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; 
} 
Смежные вопросы