1

所有,我最近本地化了整个应用程序,我面临以下问题;我的应用程序中有以下 LINQ 查询

var ccsum = from a in dtSumGL2.AsEnumerable()
    group Math.Abs(a.Field<double>(strpcPSPassBegCost)) by new 
    {
       BaseCC = a.Field<string>(strpcBaseCC)
    }
       into g
       select new
       {
          g.Key.BaseCC,
          PSPassBegCost = g.Sum()
       };

这是创建一个新对象ccsum,我们用它来创建DataTable并随后填充 SQL Server 数据库。

问题是在 中创建的每个新项目都DataTable带有列名BaseCCPSPassBegCost,但这些名称与这些名称的德语版本不匹配。现在我的问题是:有没有办法做类似的事情:

var ccsum = from a in dtSumGL2.AsEnumerable()
    group Math.Abs(a.Field<double>(strpcPSPassBegCost)) by new 
    {
       BaseCC = a.Field<string>(strpcBaseCC)
    }
       into g
       select new
       {
          g.Key.BaseCC as Resources.BaseCC,
          PSPassBegCost = g.Sum() as Resources.PSPassBegCost 
       };

以便我可以根据它们的本地化名称命名表?


编辑。DataTable从中检索 a 的代码ccsum

fooDt = Utils.LINQToDataTable(ccsum);

public static DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
{

    DataTable dtReturn = new DataTable();
    PropertyInfo[] oProps = null;
    if (varlist == null) 
    return dtReturn;

    foreach (T rec in varlist)
    {
        // Use reflection to get property names, to create 
        // table, Only first time, others will follow.
        if (oProps == null)
        {
            oProps = ((Type)rec.GetType()).GetProperties();
            foreach (PropertyInfo pi in oProps)
            {
                Type colType = pi.PropertyType;
                if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                {
                    colType = colType.GetGenericArguments()[0];
                }
                dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
            }
        }

        DataRow dr = dtReturn.NewRow();
        foreach (PropertyInfo pi in oProps)
        {
            pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
        }
        dtReturn.Rows.Add(dr);
    }
    return dtReturn;
}

谢谢你的时间。

另一种方法可能是将ccsum对象中的“列”重命名为后处理步骤,尽管sumcc在运行时请求它们之前不会填充 的值 - 还有其他想法吗?

4

3 回答 3

2

创建将列索引映射到一些可读名称的类或枚举:

public static class SumGLColumn
{
    public const int BaseCC = 0;
    public const int PSPassBegCost = 1;
}

并使用列索引而不是列名来查询您的数据表:

var ccsum = from a in dtSumGL2.AsEnumerable()
            group Math.Abs(a.Field<double>(SumGLColumn.PSPassBegCost)) 
                  by a.Field<string>(SumGLColumn.BaseCC) into g
            select new {
               BaseCCg = g.Key,
               PSPassBegCost = g.Sum()
            };
于 2013-08-01T11:28:16.597 回答
2

尝试本地化系统组件以提高人类的理解力是一个值得称赞的目标,但它会给您使用绝大多数工具和库带来挑战:通常数据库工具希望这些东西保持不变并且不了解本地化。

如果您希望您的数据库表更容易理解,也许更实际的解决方案是生成本地化视图?这些视图可以存在于一个de模式中,并且是您的表的一对一翻译。这将允许您利用许多标准工具,使您的系统在内部保持一致的“中立”文化(无论您的开发文化是什么),并在需要时提供超越这些工具的翻译。

我认为尝试将这种本地化嵌入到系统的核心可能不值得为大多数开发人员和工具集的期望付出代价,而且你最好提供一个外观。

于 2013-08-01T11:37:46.213 回答
1

这是不可能的。在 select 语句中,您定义了一个匿名类型。这不是语言特性,而是编译器特性,这意味着编译器使用您定义的属性为这种类型创建一个类。

这意味着编译器必须在编译时知道名称。如果你想要更动态的东西,我建议你使用字典:

select new Dictionary<string, object> 
{ 
    { Resources.BaseCC, g.Key.BaseCC },
    { Resources.PSPassBegCost , g.Sum() }
};
于 2013-08-01T11:15:13.377 回答