最近,我已经本地化了整个应用程序,我面临以下问题:我的应用程序中有下面的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并随后填充一个Server数据库。
问题是,在DataTable中创建的每个新项目都有列名BaseCC和PSPassBegCost,但这些名称与这些名称的德文版本不匹配。现在我的问题是:是否有一种方法可以这样做:
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检索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值--还有其他想法吗?
发布于 2013-08-01 11:28:16
创建类或枚举,它将列索引映射到一些可读的名称:
public static class SumGLColumn
{
public const int BaseCC = 0;
public const int PSPassBegCost = 1;
}并使用列索引而不是列名查询datatable:
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-01 11:37:46
试图本地化您的系统的组件以提高人们的理解是一个值得称赞的目标,但它将给您在使用绝大多数工具和库方面带来挑战:通常,数据库工具希望这些东西是恒定的,并且不了解本地化。
如果您希望您的数据库表更容易理解,那么更实际的解决方案可能是生成本地化的视图?视图可以存在于de模式中,并且是表的一对一翻译。这将允许您利用许多标准工具,使您的系统在内部保持一致的“中性”文化(无论您的开发文化是什么),并在需要的地方提供这些工具顶部的翻译。
我认为试图将这种本地化嵌入到您的系统核心可能不值得为大多数开发人员和工具集所期望的工作付出代价,而且您最好提供一个外观。
发布于 2013-08-01 11:15:13
这是不可能的在select语句中定义匿名类型。这不是语言特性,而是编译器特性,这意味着编译器使用您定义的属性为该类型创建一个类。
这意味着编译器必须在编译时知道名称。如果您想要更动态的东西,我建议您使用字典:
select new Dictionary<string, object>
{
{ Resources.BaseCC, g.Key.BaseCC },
{ Resources.PSPassBegCost , g.Sum() }
};https://stackoverflow.com/questions/17992391
复制相似问题