我所有的 EF 类都有一个Projection()
方法,可以帮助我选择要从类中投影到 SQL 查询的内容:
例子:
public static Expression<Func<Something, dynamic>> Projection()
{
return e => new
{
something = e.SomethingId,
name = e.Name,
requiredThingId = e.RequiredThingId,
requiredThing = new
{
requiredThingId = e.RequiredThing.RequiredThingId,
name = e.RequiredThing.Name,
...
},
optionalThingId = e.OptionalThingId,
optionalThing = e.OptionalThingId == null ? null : new
{
optionalThingId = e.OptionalThing.OptionalThingId,
name = e.OptionalThing.Name
}
...
};
}
我像这样使用这些投影方法:
List<dynamic> projected = dbContext.Something.Select(Something.Projection()).ToList();
这种方式让我可以在我的项目中重复使用我的预测。
我想使用ServiceStack.Text将这些列表序列化为 CSV。
我正在这样做:
string csvString = CsvSerializer.SerializeToCsv<dynamic>(Something.Select(Something.Projection()).ToList());
byte[] csvBytes = System.Text.Encoding.Unicode.GetBytes(csvString);
return File(csvBytes, "text/csv", "foo.csv");
但结果是一个空的 csv(csvString 充满了“\r\n”,仅此而已)
问题:
- 我是否正确使用了该
SerializeToCsv()
方法? - 我可以
<dynamic>
在这个库中使用吗? - 实现我的目的的建议?
对于上面的示例,所需的 CSV 将展平所有属性,例如:
"somethingId";"name";"requiredThingId";"requiredThing.requiredThingId";"requiredThing.name";"optionalThingId";"optionalThing.optionalThingId";"optionalThing.name"