简体   繁体   中英

C# Entity Framework, same result with different queries

I am querying a Sqlite database using EntityFramework.Sqlite 7.0.0-rc1-final .

The following method is the code in question:

        try
        {
            using (var db = new SfpDb.Ctx())
            {
                int baneLokId = db.tabStevne.First(a => a.Id == id).BaneLokId;
                Console.WriteLine("local baneLokId: " + baneLokId.ToString());

                IQueryable<int> baneTypeIds = db.tabBane.Where(o => o.BaneLokId == baneLokId).Select(n => n.BaneTypeId);

                List<SfpDb.HovedOvelse> testList = new List<SfpDb.HovedOvelse>();

                foreach (int i in baneTypeIds)
                {
                    Console.WriteLine("local  baneTypeIds: " + i);
                    testList.AddRange(db.tabHovedOvelse.Where(p => p.BaneTypeId == i));

                    foreach (SfpDb.HovedOvelse h in db.tabHovedOvelse.Where(p => p.BaneTypeId == i).OrderBy(k => k.navn))
                    {
                        Console.WriteLine("\tlocal HovedOvelseId: " + h.Id + " - " + h.navn);
                    }
                }

                return db.tabHovedOvelse.Where(p => baneTypeIds.Contains(p.BaneTypeId)).OrderBy(v => v.navn).ToList();
            }
        }

If calling this method twice with different input (id), the first return value is correct, but the in the second call, the return value is identical to the first call, regardless what the input (id) is. The "testList" does however contain the correct info in all calls.

Is there some kind of cache that needs to be cleared when using EF?

EDIT

Calling the method with the following:

       int stevne1 = 1;
       int stevne2 = 3;

        Console.WriteLine("Input id: " + stevne1);
        foreach (SfpDb.HovedOvelse k in getHovedOvelseByStevneId(stevne1))
        {
            Console.WriteLine("Ret val: HovedOvelseId: " + k.Id + " " + k.navn);
        }

        Console.WriteLine("Input id: " + stevne2);
        foreach (SfpDb.HovedOvelse l in getHovedOvelseByStevneId(stevne2))
        {
            Console.WriteLine("Ret val: HovedOvelseId: " + l.Id + " " + l.navn);
        }

Output:

Input id: 1
local baneLokId: 2
local  baneTypeIds: 2
        local HovedOvelseId: 3 - 2-Fri-B
        local HovedOvelseId: 6 - 4-Silhuett
        local HovedOvelseId: 7 - 5-Standard
        local HovedOvelseId: 8 - 6-VM
        local HovedOvelseId: 9 - 7-Hurtig
        local HovedOvelseId: 10 - 8-NAIS
local  baneTypeIds: 3
        local HovedOvelseId: 2 - 2-Fri-A
local  baneTypeIds: 4
        local HovedOvelseId: 1 - 1-Felt

Ret val: HovedOvelseId: 1 1-Felt
Ret val: HovedOvelseId: 2 2-Fri-A
Ret val: HovedOvelseId: 3 2-Fri-B
Ret val: HovedOvelseId: 6 4-Silhuett
Ret val: HovedOvelseId: 7 5-Standard
Ret val: HovedOvelseId: 8 6-VM
Ret val: HovedOvelseId: 9 7-Hurtig
Ret val: HovedOvelseId: 10 8-NAIS


Input id: 3
local baneLokId: 1
local  baneTypeIds: 2
        local HovedOvelseId: 3 - 2-Fri-B
        local HovedOvelseId: 6 - 4-Silhuett
        local HovedOvelseId: 7 - 5-Standard
        local HovedOvelseId: 8 - 6-VM
        local HovedOvelseId: 9 - 7-Hurtig
        local HovedOvelseId: 10 - 8-NAIS
local  baneTypeIds: 1
        local HovedOvelseId: 4 - 3-Luft-AD
        local HovedOvelseId: 5 - 3-Luft-BC

Ret val: HovedOvelseId: 1 1-Felt
Ret val: HovedOvelseId: 2 2-Fri-A
Ret val: HovedOvelseId: 3 2-Fri-B
Ret val: HovedOvelseId: 6 4-Silhuett
Ret val: HovedOvelseId: 7 5-Standard
Ret val: HovedOvelseId: 8 6-VM
Ret val: HovedOvelseId: 9 7-Hurtig
Ret val: HovedOvelseId: 10 8-NAIS

And, changing the input to the following: int stevne1 = 3; int stevne2 = 1;

Input id: 3
local baneLokId: 1
local  baneTypeIds: 2
        local HovedOvelseId: 3 - 2-Fri-B
        local HovedOvelseId: 6 - 4-Silhuett
        local HovedOvelseId: 7 - 5-Standard
        local HovedOvelseId: 8 - 6-VM
        local HovedOvelseId: 9 - 7-Hurtig
        local HovedOvelseId: 10 - 8-NAIS
local  baneTypeIds: 1
        local HovedOvelseId: 4 - 3-Luft-AD
        local HovedOvelseId: 5 - 3-Luft-BC

Ret val: HovedOvelseId: 3 2-Fri-B
Ret val: HovedOvelseId: 4 3-Luft-AD
Ret val: HovedOvelseId: 5 3-Luft-BC
Ret val: HovedOvelseId: 6 4-Silhuett
Ret val: HovedOvelseId: 7 5-Standard
Ret val: HovedOvelseId: 8 6-VM
Ret val: HovedOvelseId: 9 7-Hurtig
Ret val: HovedOvelseId: 10 8-NAIS


Input id: 1
local baneLokId: 2
local  baneTypeIds: 2
        local HovedOvelseId: 3 - 2-Fri-B
        local HovedOvelseId: 6 - 4-Silhuett
        local HovedOvelseId: 7 - 5-Standard
        local HovedOvelseId: 8 - 6-VM
        local HovedOvelseId: 9 - 7-Hurtig
        local HovedOvelseId: 10 - 8-NAIS
local  baneTypeIds: 3
        local HovedOvelseId: 2 - 2-Fri-A
local  baneTypeIds: 4
        local HovedOvelseId: 1 - 1-Felt

Ret val: HovedOvelseId: 3 2-Fri-B
Ret val: HovedOvelseId: 4 3-Luft-AD
Ret val: HovedOvelseId: 5 3-Luft-BC
Ret val: HovedOvelseId: 6 4-Silhuett
Ret val: HovedOvelseId: 7 5-Standard
Ret val: HovedOvelseId: 8 6-VM
Ret val: HovedOvelseId: 9 7-Hurtig
Ret val: HovedOvelseId: 10 8-NAIS

In the first query the values printed locally in the method is the same as the ones returned. But that is not the case in the latter query. Also the returned values are the same in both cases.

After I changed the input the same thing happened. Local and returned values are the same in the first query, and returned values for both queries are the same.

Also, the "testList" contains the correct info, but I'd rather perform queries than looping for info.

Actually, changing from

IQueryable<int> baneTypeIds = db.tabBane.Where(o => o.BaneLokId == baneLokId).Select(n => n.BaneTypeId);

or

var baneTypeIds = db.tabBane.Where(o => o.BaneLokId == baneLokId).Select(n => n.BaneTypeId);

to

List<int> baneTypeIds = db.tabBane.Where(o => o.BaneLokId == baneLokId).Select(n => n.BaneTypeId).ToList();

resolved the problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM