簡體   English   中英

C#實體框架,具有相同查詢的相同結果

[英]C# Entity Framework, same result with different queries

我正在使用EntityFramework.Sqlite 7.0.0-rc1-final查詢Sqlite數據庫。

以下方法是有問題的代碼:

        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();
            }
        }

如果使用不同的輸入(id)調用此方法兩次,則第一個返回值是正確的,但是在第二個調用中,無論輸入(id)是什么,返回值都與第一個調用相同。 但是,“ testList”在所有調用中均包含正確的信息。

使用EF時是否需要清除某種緩存?

編輯

使用以下方法調用該方法:

       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);
        }

輸出:

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

並且,將輸入更改為以下內容: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

在第一個查詢中,方法中本地打印的值與返回的值相同。 但是,在后一個查詢中並非如此。 兩種情況下返回的值也相同。

在更改輸入后,發生了同樣的事情。 在第一個查詢中,本地值和返回值相同,並且兩個查詢的返回值都相同。

另外,“ testList”包含正確的信息,但是我寧願執行查詢而不是循環獲取信息。

實際上,從

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

要么

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

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

解決了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM