3
 var dbPerson = from p in db.People 
                where p.Id == PersonId select p;
 dbPerson[0].HolidaysRemaining--;

タイプ 'system.linq.lqueryable,holidayBookingApp.model.person> の式に [] を使用したインデックス作成を適用できないという dbPerson[0] のエラーがスローされます

誰かがこれを解決する方法を教えてもらえますか?

ありがとう

4

4 に答える 4

4

クエリdbPersonが返す最初のアイテムを取得するには、次を使用します

var firstPerson = dbPerson.First();

またはSingle、一致が 1 つしかないと予想し、この予想が破られた場合に例外をスローする場合。

firstPerson.HolidaysRemaining--;ただし、追加のコードなしでデータベース内の何かが変更されるとは確信していません。

var dbPeopleWithThisId = from p in db.People 
                         where p.Id == PersonId
                         select p;
var specificPerson = dbPeopleWithThisId.Single();
specificPerson.HolidaysRemaining--;
db.SaveChanges(); // Thanks to J. Steen
于 2012-12-14T13:23:27.203 に答える
2

これdbPersonは、IEnumerable がインデックス作成の概念をサポートしていないためです。のようないくつかの Linq メソッドを使用するかdbPerson.First()、単純に List に変換できます。

var list = dbPerson.ToList();
list[0].HolidaysRemaining--;
于 2012-12-14T13:27:25.250 に答える
1

Linq & IEnumerable (& IQueryable) インターフェイスの背後にある考え方を理解する必要があります。IEnumerable はシーケンスの遅延読み込みに使用されるため、次のようなループの拡張メソッドを作成すると:

public static IEnumerable<T> LazyForEach<T>(this IEnumerable<T> source, Action<T> action) //action to perform                
        {
            if (action == null) throw new ArgumentNullException("action");
            foreach (T element in source)
            {
                action(element);
                yield return element;
            }
        }

IEnumerable を返すメソッド (Linq) チェーンで LazyForEach を使用してみてください。

db.People.Where(p=>p...).LazyForEach(p=>
{
   MessageBox.Show(p.ToString());
});

提供されたアクションのコードは、ToList/ToArray/ElementAt/First/Last/Any/Take/Skip で列挙を強制するまで (おそらく部分的に) 実行されません ... または alt を作成できます。拡大:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
        {
            if (source == null)
                return null;
            if (action == null) throw new ArgumentNullException("action");
            //var sourceList = source.ToList(); //forcing enumeration
            var sourceList = new List<T>();
            foreach (var element in source)
            {
                action(element);
                sourceList.Add(element);
            }
            return sourceList;
        }
于 2012-12-14T13:42:23.317 に答える