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 回答