1

ItemDescription 列と Item BalanceQty 列で構成される InventoryItem という名前のテーブルがあります。comboBox で選択された ItemName の BalanceQty を取得したいと考えています。このために、データ アクセス レイヤーにメソッドを作成し、文字列値を表す文字列パラメーターを渡しました。このメソッドへの ItemDescription の。これは Entity Framework を使用して実装されています。これが私のコードの外観です。

public float GetAvailableQty(string itemName)
{
    float availableQty =(from table in context.InventoryItem
    where table.ItemDescription == itemName
    select table.BalanceQuantity);

    return availableQty;
}    

しかし、それは私に次のエラーを与えています-

タイプ 'System.Linq.IQueryable' を 'float' に変換できません

どこが間違っていますか?

4

2 に答える 2

3

おそらくこれが必要です:

double availableQty =(from table in context.InventoryItem
    where table.ItemDescription == itemName
    select table.BalanceQuantity).Sum();

IQueriable は式ツリーを返します。このようなクエリの結果は行セットであり、ToList() を使用するか、IEnumerable に代入することで暗黙的に IEnumerate に具体化できます。とにかく、単一の値ではなく、行セットになります。クエリが単一のものを返すことが確実な場合は、.Single() または SingleOrDefault を使用します。IQueriable の他の拡張メソッドを参照してください。

それ以外の場合、配列が必要な場合は、結果を IEnumerable 変数に割り当てます。

于 2013-11-09T07:46:05.497 に答える
1

あなたのLinqはIqueryableを返すので...

3 つの異なる quatities を持つアイテムで 3 つの行があると仮定しましょう (ばかげていますが、ペイントの色のように、アイテムごとに複数の値を持つことができる他のものについて考えてみてください)。あなたの linq は 3 つの数量を返し、それが数値であると想定しています

Firstまたはを使用FirstOrDefaultして、最初の項目またはそのオブジェクトのデフォルト値を取得できます。

あなたの場合、それは問題ではありませんが、Linq がどのように機能し、何を返すかを理解する必要があります...


もう一つの例:

仮定しましょう : List numbers = {1,2,3,4,5,6} (それらが int であると仮定しましょう)。そしてあなたは: var small_numbers = numbers.Where(x => x<4) あなたが得るものは、あなたが次のようにクエリできるものです:)foreach (var small in small_numbers) {...}。結果は int ではありません。

最初、最後、そして実際には int を取ることができます。しかし、あなたが得るのはコレクションです。したがって、次のようにしても:は intvar one_result = numbers.Where(x => x<2)ではありません。one_result

于 2013-11-09T07:47:21.183 に答える