我对我的DBModel类有一个LINQ查询,它返回一个匿名类型。我必须将它转换为已知的C#类类型。
我可以直接在DBModel类中使用已知类型,但不允许在我的项目架构中使用任何已知类型。
示例:
static dynamic getEmployees()
{
SampleDB db = new SampleDB();
var result = (from x in db.Employes
select new
{
name = x.FirstName + " " + x.LastName,
department = x.DepartmentId
});
return result;
}
我的已知类型:
public class Emp
{
public string name { set; get; }
public int department { set; get; }
}
程序:
dynamic d = getEmployees();
List<Emp> result = d.cast<Emp>();
//Other code....
如何将动态类型转换为List?在getEmployees
我不能像
static List<Emp> getEmployees()
{
SampleDB db = new SampleDB();
var result = (from x in db.Employes
select new Emp
{
name = x.FirstName + " " + x.LastName,
department = x.DepartmentId
}).ToList();
return result;
}
有人能告诉我如何将LINQ返回类型转换为已知类型?
答案 0 :(得分:0)
cast
类型没有dynamic
方法。你应该做的是显式地将动态转换为所需的类型,因为在动态方法中你有一个无限的对象,你将不得不做一个中间步骤。
类似的东西:
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var json = serializer.Serialize(d);
List<Emp> result = serializer.Deserialize<List<Emp>>(json);
答案 1 :(得分:0)
Cast<>
是一种扩展方法,动态对象不直接支持这些方法。
你可以通过调用这样的扩展方法来解决这个问题:Enumerable.Cast<Emp>(d)
,但是这仍然不起作用,没有从匿名类型到Emp的已知转换。
你可以尝试与.Select()
类似的东西,这应该有效。然而,最简单的方法是简单的for循环
dynamic d = getEmployees();
var emps = new List<Emp>();
foreach (var emp in d)
{
emps.Add(new Emp(){name = emp.name, department = emp.department};
}
如果你想按需使用集合作为IEnumerable,而不是把它放在List中,你可以用辅助方法包装它:
IEnumerable<Emp> getEmps(dynamic d)
{
foreach (var emp in d)
{
yield return new Emp(){name = emp.name, department = emp.department};
}
}