2013-10-03 66 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表达式来提高查询的质量;并且不使用列表。

相关问题