2013-10-03 96 views
0

我在配置我自己的數據庫時遇到了問題,並且遇到了使用Entity Frameworks來管理語言的應用程序的相關代碼隱藏問題。我如何管理語言?

通常情況下,在我的老項目,我有一個表,讓我們說頁面,其中包含唯一的行標識單頁,標準信息(不需要翻譯的話):

ID 
Author 
Date 
Location 

附此我有一個支持臺Pages_L(1-N),其中包含語言的數據,翻譯的每一頁行這麼具體的信息:

ID 
ID_PAGE 
LANGUAGE 
Title 
Description 
Notes 

嘛,一臺數據庫的ard配置!沒有數據冗餘。

現已成爲實體框架,因爲我想提取特定的頁面,我需要每次都做的問題一個選擇:

1 - first the page (a `.Where`); 
2 - than select the language (another `.Where`) 
3 - finally, select the field I want (let say, `Title`) 

我覺得這是一個惱人的過程,因爲當我做我需要提取只有固定語言的數據的查詢。我的意思是:當我的應用程序正在處理時,語言總是一個。我不提取一些英文,一些意大利文,一些法文,等等。

所以我想實現它是整個語境中的一種「起始語言點」。 在後一階段的話,我只需要做:

Pages.Where(p=>p.ID==myID).FirstOrDefault().Title 

不用每次都通過trought的Pages_L表。

問題是:我可以用Entity Framework以某種方式做到這一點嗎?我可以改變我的項目中的一切,所以每一個建議都會很好! (從DB到實體框架,再到其他供應戰略)。

回答

0

希望我沒有誤解你。

爲什麼不直接寫一個方法來返回你搜索的整個記錄​​作爲一個對象,然後從返回的對象中返回你想要的字段?該方法將返回一個頁面類型的對象,但包含的東西,你可以返回一個頁面對象與Pages_L實體相關,根據你的侷限當然。然後你可以到達你想要的部分的任何領域。就像,讓我們調用你的方法myQuery。

Page page = myQuery(language, pageID); 
    string ttl = page.Pages_L.Title; 

這應該工作。如果沒有,您可以使用lambda表達式來達到標題或簡單地:

Page page = myQuery(language, pageID); 
    Pages_L pages_l = page.Pages_L; 
    tring ttl = pages_L.Title; 

應該工作。

只需編寫一個方法,將頁面和Pages_L作爲Page對象返回,並採用適當的LANGUAGE和ID參數。

public static Page (string lang, int pageID){ 
    YourDBName dbContext = new YourDBName; 
    List<Page> pageList = ctx.Page.Include("Pages_L").Where(p=>p.ID == pageID); 
    Pages_L pages_l = new Pages_L(); 
    foreach (Page page in pageList){ 
    pages_l = page.Pages_L; 
    if(pages_l.Language == lang){ 
    return page; 
    }}} 

應該有一個更好的辦法,使這當然查詢,這有點跛,以消除用foreach的記錄,但我沒有一個有用的數據庫,現在來測試這樣的查詢。此外,如果您確定至少有一條記錄,則必須調用此函數。它就像「First」,但不像「FirstOrDefault」。但是,如果我沒有誤解你的問題,這應該工作。如果這有幫助,可以使用多個「Where」和一些lambda表達式來提高查詢的質量;並且不使用列表。

相關問題