0

我在配置自己的数据库和使用管理语言的实体框架制作应用程序的相关代码隐藏时遇到问题。

通常,在我的旧项目中,我有一个表,比如说Pages,其中包含标识单个页面的唯一行,并带有标准信息(根本不需要翻译):

ID
Author
Date
Location

附加到这个我有一个包含语言数据的支持表Pages_L (1-N),因此为每个页面行翻译了特定信息:

ID
ID_PAGE
LANGUAGE
Title
Description
Notes

好吧,数据库的标准配置!没有数据冗余。

现在问题出现在实体框架中,因为对于我要提取的特定页面,我每次都需要进行选择:

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

每次都没有通过处理Pages_L表。

问题是:我可以用实体框架以某种方式做到这一点吗?我可以更改项目中的所有内容,因此每个建议都会很好!(从 DB,到实体框架,再到其他供应策略)。

4

2 回答 2

0

希望我没有误会你。

您为什么不编写一个方法,将您搜索的整个记录​​作为一个对象返回,然后从返回的对象中,到达您想要的字段?该方法将返回一个 Page 类型的对象,但是使用 Include 东西,您当然可以根据您的限制返回一个 Pages_L 实体与其相关的 Page 对象。然后你可以在你想要的部分到达它的任何领域。就像,让我们将您的方法称为 myQuery。

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

这应该有效。如果没有,您可以使用 lambda 表达式来达到 Title 或简单地:

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

应该管用。

只需编写一个方法,将 Page 和 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 表达式来提高查询质量;并且不使用列表。

于 2013-10-03T15:09:56.503 回答
-1

为了在您的页面中使用不同的语言,您可以使用页面资源,它不需要连接数据库以获得语言值。你可以检查;

http://msdn.microsoft.com/en-us/library/ms227427.aspx http://msdn.microsoft.com/en-us/magazine/cc163566.aspx

于 2013-10-03T07:45:00.773 回答