1

次のコードの目的は、使用可能な ID を見つけることです。

私がそれを書いたときの私の考えは、実行されるたびに、ローカル変数query.Any()の新しくインクリメントされた値でクエリが再度実行されるということでした。これは、クエリが実行されるまで評価されないidという私の知識から生まれました。id

私の実験の結果から、これがどのように機能するかではないことがわかります。LINQ to EF を使用するスタイルを維持しながら、指定された目標を達成するためにコードを書き直す方法を知りたいですか?

簡単な方法で書き直す方法を知っています。私の目標は、LINQ 式の遅延実行とその実行コンテキストをよりよく理解することです。

int id = 4700;
var query = from c in Advertisers
            where c.ID == id
            select c;
int loopCount = 0;
while(query.Any())
{
    if(++loopCount == 5)
    {
        Console.WriteLine ("Cannot find a safe id.");
        break;
    }
    Console.WriteLine ("Already a record with " + id);
    id++;
}
Console.WriteLine ("The available id is " + id);
4

1 に答える 1

0

上記のコードから、id は更新されますが、IQueryable オブジェクトは更新されないという問題があります。クエリの where 句で id の値を変更する必要があります。私が知っている最も簡単な方法は、最初のクエリをカプセル化してから、必要なものを変更することです。

例えば:

    using (var context = new ModelContainer())
    {
        IQueryable<Advertiser> queryAdvertisers = 
            from c in context.Advertisers
            select c;

        for (int i = 0; i < 100; i++)
        {
            if (queryAdvertisers.Where(a => a.ID == i).Any())
            {
                Console.WriteLine("ID:{0} already exists.", i);
            }
            else
            {
                Console.WriteLine("ID:{0} does not exist.", i);
            }
        }
    }

通常、queryAdvertisers をメソッドまたはクラスにリファクタリングします。

于 2012-12-01T00:23:59.783 に答える