0

次のような LINQ クエリがあります。

var Item = (from s in contextD.Items where s.Id == Id select s).ToList();

さらに下にある Item オブジェクトのプロパティは次のように設定されています。

Item.FirstOrDefault().Qty = qtyToUpdate;
Item.FirstOrDefault().TotalPrice = UItem.FirstOrDefault().Qty *  UItem.FirstOrDefault().Price;
 ...

私の質問は、FirstOrDefault を呼び出すと、クエリによって返された結果セットが常にループするのでしょうか?

単一の呼び出しを行い、次のようにオブジェクトに入れるべきではありません:

MyObject objMyObject = new MyObject;
objMyObject = Item.FirstOrDefault();

次に、objMyObject プロパティの設定に取り掛かります。

FirstOrDefault を使用する最初の部分は、実際には本番環境にあります。それが正しい方法であるかどうかを確認しようとしています。

よろしく。

4

1 に答える 1

4

FirstOrDefault を呼び出すと、クエリによって返された結果セットが常にループされますか?

FirstOrDefault()すべての結果セットをループすることはありません。最初のアイテムを返すか、セットが空の場合はデフォルトを返します。また、この特定のケースでは、列挙子も作成されません。したがって、タイプFirstOrDefault()の変数を呼び出しているためList<T>、単にインデックスの項目0が返されます (リストが空でない場合)。Enumerable.FirstOrDefault()実装を調査する場合:

IList<TSource> list = source as IList<TSource>;
if (list != null)
{
    if (list.Count > 0)
    {
        return list[0];
    }
}

ただし、これは を呼び出すたびに呼び出されますFirstOrDefault()

また、「デフォルト」のケースがありません。最初のサンプルのようにメソッドをチェーンしている場合はNullReferenceException、リストが空の場合に取得できます。したがって、クエリによって何かが返されたことを確認してください。

var item = Item.FirstOrDefault();
if (item == null)
    return; // or throw

item.Qty = qtyToUpdate;
var uitem = UItem.FirstOrDefault();
if (uitem == null)
    return; // or throw

item.TotalPrice = uitem.Qty * uitem.Price;

FirstOrDefault()もう 1 つ注意してください。インメモリ コレクションを実行している場合、パフォーマンスにほとんど違いはありません。ただし、クエリ結果をリストに保存せずに実行すると、その違いは非常に大きくなります。その場合、呼び出しごとに 新しいデータベース クエリが発生します。FirstOrDefault()

于 2013-09-19T10:30:28.087 に答える