2016-02-05 39 views
1

我的問題的拳頭部分 一些幫助假設我有一個POCO類通過Linq獲取大量記錄的有效方法。另外,關於編輯現有數據庫條目

public class shop{ 
public virtual string fruitName {get;set;} 
public virtual double numberOfFruitsLeftToConsume {get;set;} 
public virtual double numberOfFruitsLeftForStorage {get;set;} 
public virtual List<Locations> shopLocations {get;set;} 
} 

我在數據庫中創建店鋪的新對象添加新的水果,然後將其添加通過我的上下文然後保存它。 現在檢索數據 對於我來說,首先通過水果名稱進行過濾來獲得一個List,然後在該集合中運行我的查詢以根據要消耗的水果數進行排序,或者我應該將它全部放入一個查詢。假設該網站的點擊次數超過1000次/秒,並且數據庫數量巨大,哪種方法效率更高。

List<shop> sh = context.shopDB.Where(p => p.fruitName == "mango" && 
            p.fruitName == "apple").ToList(); 
List<shop> sh = sh.Where(f => f.numberOfFruitsLeftToConsume >= 100 && 
         f.numberOfFruitsLeftForStorage <= 100).ToList(); 

該示例沒有意義,我只是想顯示我正在使用的查詢的類型。

我的問題的第二部分是,當我初始化類商店時,我不初始化其中的列表。稍後當我嘗試添加它時,它不會被保存,商店被連接到用戶。

ApplicationUser user = await usemanager.FindByEmailAsync("email"); 
if(user.shops.shopLocations == null){ 
    user.shops.shopLocation = new List<Location>(); 
    uset.shops.shopLocation.Add(someLocation); 
    await context.shopDB.SaveChangesAsync(); 
} 
////already tried 
//List<Location> loc = new List<Location>(); 
//loc.Add(someLocation); 
//user.shops.shopLocation = loc; 
//await context.shopDB.SaveChangesAsync(); 

我嘗試了try catch塊中的兩個方法,並且沒有拋出異常。

如果您需要更多詳細信息或者如果您不清楚,請詢問。

謝謝。

如果我將Location和LocationId屬性添加到購物中,然後保存,則只能查看LocationId,但Location屬性仍然爲空。 要清除任何問題,如果我保存一個位置單獨保存。所以我不認爲我提供了錯誤的數據。

+0

LINQ使分頁非常簡單 - 請參閱[使用LINQ的大頁面結果集](https://msdn.microsoft.com/en-us/library/gg334684.aspx)。 – NightOwl888

+0

您正在**排序**,但示例查詢執行**過濾**。那麼情況如何? –

+0

@ NightOwl888是的我知道,我正在使用它們來設置不同課程的頁數。我無法使用它限制水果名稱的數量,因爲這不是意圖。 – hispeed

回答

0

現在檢索數據會更有效,我首先通過水果名稱進行過濾獲取一個List然後在該集合中,我應該運行我的查詢來排序水果的數量,或者我應該只是把它全部放入一個查詢中。假設該網站的點擊次數超過1000次/秒,並且數據庫數量巨大,哪種方法效率更高。

您是唯一可以通過測量查詢性能來回答該問題的人。 只有作爲一般規則我可以​​說,把所有的一個查詢,讓數據庫做大部分工作(最終通過創建適當的索引調整它)通常是可取的。

什麼問題的第二部分(其基本上是一個不同的問題),這塊

if (user.shops.shopLocations == null) 
{ 
    user.shops.shopLocation = new List<Location>(); 
    user.shops.shopLocation.Add(someLocation); 
    await context.shopDB.SaveChangesAsync(); 
} 

可疑活動。您的shopLocations成員宣佈爲virtual,這意味着它的使用是延遲加載,因此很可能永遠不會是null。而且即使是null,你只需要保留的ifnew部分,做外其餘的,像這樣的

if (user.shops.shopLocations == null) 
    user.shops.shopLocation = new List<Location>(); 

user.shops.shopLocation.Add(someLocation); 
await context.shopDB.SaveChangesAsync(); 
+0

我會嘗試測量性能。關於第二部分,我也嘗試過這一點。一切正常,沒有例外,但內容不被保存。當我嘗試檢索數據時,我得到空引用異常。 – hispeed

+0

非常感謝您的幫助。最後,你向我解釋了虛擬的含義。問題的第二部分由你回答,事實證明我沒有將這些屬性標記爲虛擬的,所以如果沒有有效地添加它們。你知道爲什麼嗎? – hispeed

+0

因爲當屬性是虛擬的時候,EF創建的代理對象將覆蓋它們並可以跟蹤您使用代碼所做的更改。 –

0

1提問

因爲你是在結束通話.ToList()你的查詢將不得不每次從db中獲取所有行,因此在LINQ .Where()這樣的調用中進行所有過濾的速度會快得多:

List<shop> sh = context.shopDB.Where(p => p.fruitName == "mango" && p.fruitName == "apple" && f.numberOfFruitsLeftToConsume >= 100 && f.numberOfFruitsLeftForStorage <= 100).ToList(); 

但如果你不先LINQ查詢末尾調用.ToList(),劈裂查詢到兩個通話將tottally罰款,將產生相同的性能,前一種方法是這樣的:

var sh = context.shopDB.Where(p => p.fruitName == "mango" && 
            p.fruitName == "apple"); 
List<shop> shList = sh.Where(f => f.numberOfFruitsLeftToConsume >= 100 && 
         f.numberOfFruitsLeftForStorage <= 100).ToList(); 

第二個問題

在初始化位置的店,你必須設置shopId財產,那麼它應該工作,如果沒有問題,可能是您的數據庫關係。

+0

謝謝你回答第一個問題。我會嘗試他們兩個。關於第二個問題,我應該在哪裏設置shopId屬性?在Location類中? – hispeed

+0

是的,它應該與商店類相關,但是如果您使用的是codefirst,則應將商店設置爲位置類本身。 – Shaegorath

+0

你的意思是這樣的:public class location {public virtual int shopId {get; set;}}或其他東西。是的,我首先使用代碼,您是如何將商店設置在自己的位置類上的,比如將它們合併在一起? – hispeed

相關問題