2016-02-05 54 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