我有一个字符串变量myFieldname。我如何使用它的值作为linq表达式中的别名?在LINQ中为新的匿名对象的属性使用动态的“字符串别名”?
收起
string myFieldname = "theName";
var q = (from d in data select new { d.Id, myFieldname = d.Amount });
我想theName
是别名不是myFieldname
本身。
我有一个字符串变量myFieldname。我如何使用它的值作为linq表达式中的别名?在LINQ中为新的匿名对象的属性使用动态的“字符串别名”?
收起
string myFieldname = "theName";
var q = (from d in data select new { d.Id, myFieldname = d.Amount });
我想theName
是别名不是myFieldname
本身。
因为匿名类型在您的代码中包含真实类型(包括属性名称),所以不能轻易实现。
您必须在执行时生成一个类型,然后为您的投影创建一个表达式树。这听起来像lot工作给我。
为什么你想要属性名称是动态呢?为什么你不能调整在其他地方动态使用的名称?这里的大图是什么?
,因为直到运行时才知道名称,并且因为网格的ItemSource设置了结果,所以动态名称是很重要的 – Mehrdad
@Mehrdad:真的* shouldn' t *是这种情况 - 网格中名称的使用方式如何?在LINQ之前你会做什么?假设只是显示正确的头文件或类似的东西,我相信可以以不同的方式动态完成。如果你能给我们提供更多关于你想要做什么的信息,以及为什么你认为你需要它是动态的,那真的很有帮助。 –
你不能(至少,没有任何理智的方式)。我可以看到这样做的唯一方法是使用在Expando对象,然后:
foreach(var pair in data select new { d.Id, d.Amount})
{
var obj = new ExpandoObject();
IDictionary<string, object> dict = obj;
dict[myFieldname] = obj.Amount;
dict["Id"] = d.Id;
// add obj to a list or similar
}
您可以使用ExpandoObject
与dynamic
API,但即使如此,我不清楚这是什么意思帮助你与...
这正是我想要的,但它说:不能将索引与[]应用到类型'System.Dynamic.ExpandoObject'的表达式 – Mehrdad
@Mehrdad我认为它有一个索引器;使用.Add来代替 –
@Mehrdad查看更新 –
如果你需要这种动态 - 你可能会移动到PHP。 – zerkms
@pst:可能是我失去了我的“讽刺”符号;-) – zerkms
@zerkms哈哈。是的,确实:)我非常担心... – 2011-07-09 06:38:12