【问题标题】:Dynamic column in LinqLinq 中的动态列
【发布时间】:2013-05-11 21:52:30
【问题描述】:

我正在创建一个使用多种语言(en、fr、es)的网站,例如,在我的数据库中,我有一个表国家,其中:id、name_en、name_fr 和 name_es 作为列,分别包含国家的英文名称、法语和西班牙语。

我正在使用 mvc 3、c# 和实体框架。

我已经有一个返回当前语言的函数:GetCurrentLang() 并返回字符串“en”、“fr”或“es”。

我想按右列排序,并在我的 foreach 中也获得右列。

这是我的代码:

using (var db = new InsoutingContext())
        {
            var queryCountries = from qCountries in db.Countries.Where(r => r.Cities.Count > 0 )
                                 orderby qCountries.Name_fr
                                 select qCountries;
            foreach (var item in queryCountries)
            {
                Countries.Add(new ListItem((item.Name_fr), item.Id.ToString()));
            }
        }

【问题讨论】:

    标签: linq c#-4.0 asp.net-mvc-4


    【解决方案1】:

    由于您对其建模的方式,您需要有条件地将排序附加到查询中,例如:

    var currentLang = GetCurrentLang();
    var queryCountries = db.Countries.Where(r => r.Cities.Count > 0 );
    
    if (currentLang == "es")
    {
       queryCountries = queryCountries.OrderBy(c => c.Name_Es);
    }
    else if (...) // etc.
    

    您没有进行预测,因此您的查询结果将是一系列国家/地区,其中包含您的所有属性。

    这个模型显然不是很可扩展,所以我会规范化你的 countries 表,并有一个引用 languagescultures 的外键> 表,然后在您的实体上使用导航属性。然后您将只加载当前语言的国家/地区,您可以按名称对其进行排序。

    【讨论】:

    • 感谢回复,那是我不想做的事情,因为,我所有的桌子都有类似的东西,我想我必须在 Country.Add(new ListItem((item .Name_fr)、item.Id.ToString())); 以及任何地方。当您告诉“由于您建模它的方式”时,您能否建议我必须如何建模它,例如在此表中。如果我不回复,我必须搬家 :) Znd thanx 再次回复
    • 是的,所以您需要按照说明更改模型。例如。国家 - ID、LanguageId、名称。语言 - ID、代码。这是最简单的一对多关系示例。
    • 您可能想要引入一个翻译表,这样同一个国家就不会因为文化差异而被建模为不同的实体。
    • 哦,对不起,我没有在您的第一个回复中看到您的建议,我看到了代码并开始思考并回复。所以我的所有表格中的每个值都会有 3 行。这听起来很棒,即使我不希望在每个国家、城市和其他表格的表格中都有 3 行。幸运的是,我刚刚开始使用该应用程序,因此我可以对其进行改造。第二个问题,如果可以的话:为什么当我们在 sql server 中删除列并在 VS 中更新模型 edmx 时,它不会删除实体中的属性?最后一个关于stackoverflow的问题为什么我们在问题的开头写“嗨”它删除了它?谢谢:)
    • 你好,我重新打开话题:) 我完成了改造,但意识到我有一点问题。用户(用户表)有一个城市,因此用户包含 CityId 作为引用城市的外键。但在这种情况下(改造的数据库)用户将只有一个城市和一种语言。如何解决?我有两个想法,但不确定它们是否好:1:创建一个 ASS_City_User (id_user, id_city) 或 2:在 City 添加另一个 Id_Second 并将相同的 Id_Second 分配给不同语言的同一个 City。并在用户中添加 Id_Second 你认为什么? :)
    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多