2016-02-05 64 views
1

我对我的DBModel类有返回匿名类型的LINQ查询。我必须将其转换为已知的C#类类型。将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.... 

我怎么能投的动态类型列表?在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返回类型为已知的种类?

+2

“在getEmployees我不能使用像” - 为什么不? – poke

+3

什么样的_project architecture_是不允许你返回已知类型的东西? –

回答

0

Cast<>是一个扩展方法,和那些不直接支撑在动态对象。

你可以通过调用像这样的扩展方法来解决这个问题:Enumerable.Cast<Emp>(d),但是这仍然行不通,没有从匿名类型到Emp的已知转换。

你可以尝试类似.Select(),这应该工作。然而,最简单的方法是循环

dynamic d = getEmployees(); 
var emps = new List<Emp>(); 
foreach (var emp in d) 
{ 
    emps.Add(new Emp(){name = emp.name, department = emp.department}; 
} 

一个简单的,如果你想消费点播的集合作为一个IEnumerable,而不是把它在一个列表,你可以在一个辅助方法把这个包:

IEnumerable<Emp> getEmps(dynamic d) 
{ 
    foreach (var emp in d) 
    { 
     yield return new Emp(){name = emp.name, department = emp.department}; 
    } 
} 
+0

**谢谢@ HugoRune **处理变化比以前更好。这是最佳答案 – user3625533

0

dynamic类型上没有cast方法。你应该做的是明确地将你的动态转换为所需的类型,并且因为在动态方法中你有一个不重要的对象,你必须做一个中间步骤。 是这样的:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
var json = serializer.Serialize(d); 
List<Emp> result = serializer.Deserialize<List<Emp>>(json); 
+0

已经尝试过这些转换,并导致例外。 'Can not convert type'System.Collections.Generic.List <<> f__AnonymousType0 >'to'System.Collections.Generic.List ' – user3625533

+0

这是因为在动态查询中,您没有指定新对象的类型。 – Zippy

+0

@ user3625533检查更新的答案 – Zippy