2016-10-21 26 views
0

我有一個LINQ查詢,它返回一個表中的結果。我需要將其轉換爲該表模型的列表。匿名類型groupManager的是列表< a> where一個是{組G5}無法將匿名列表轉換爲LINQ中的已知列表

var groups = new List<Group>(); 
var groupManager = (from a in db.AUsers 
           join b in db.BUsers on a.Id equals b.UserID into group1 
           from g1 in group1.DefaultIfEmpty() 
           join c in db.UserRoles on g1.ID equals c.UserID into group2 
           from g2 in group2.DefaultIfEmpty() 
           join d in db.Roles on g2.RoleID equals d.ID into group3 
           from g3 in group3.DefaultIfEmpty() 
           join e in db.RoleGroups on g3.ID equals e.RoleID into group4 
           from g4 in group4.DefaultIfEmpty() 
           join f in db.Groups on g4.GroupID equals f.ID into group5 
           from g5 in group5.DefaultIfEmpty() 
           where a.Id == user.ID && g5.Name != "" 
           select new{ Group = g5}).ToList(); 

groups = groupManager.Cast<Group>().ToList(); 

此代碼似乎並不work.The錯誤,我得到的是{「無法投型」<> f__AnonymousType11`1對象[Group]'鍵入'Group'。「}我錯過了什麼嗎?

+4

如果你只是想要這個值本身,你爲什麼要把值放在一個匿名對象中呢? – Servy

+0

groupManager是類型列表() 爲什麼你甚至試圖施放它? – Dzhambazov

+0

@Servy你認爲我應該做什麼? – TheFallenOne

回答

0

您可能會在沒有匿名類型或演員的情況下執行此操作。

var groups = (from a in db.AUsers 
       // Your query... 
       select new Group 
       { 
        // Properties of Group 
        Name = g5.Name, 
        AnotherProperty = g5.AnotherProperty 
       }).ToList(); 
+0

很多表格中的列,當然應該有一個更簡單的方法 – TheFallenOne

+0

您的表是EntitySet ?如果是這樣,只需按照Hogan的建議選擇g5即可。我認爲情況並非如此,因爲我認爲你自己會得到這些信息。 –

1

嗯......你嘗試過嗎?

select new Group(g5)).ToList(); 

或本

select g5).ToList(); 

很難說,更不知道有關該組對象或其它類型的在您的示例東西。

+0

因爲我的組構造函數沒有使用參數,所以不起作用。嘗試第二個,讓我檢查 – TheFallenOne

+0

@The_Outsider - 然後編寫一個構造函數來實現或使用第二個示例。 – Hogan

0

提供的答案是絕對正確的,但我想這可能是一個很好的事情關於Cast方法(並回答「我是否錯過了什麼」部分)。

Cast方法確實用於將列表中的所有對象轉換爲其他類型的不同目的。毫不奇怪,編譯器會拋出這個異常,因爲Cast的做法是採用IEnumerable(非通用版本)並返回相同的集合,但是使用通用的IEnumerable<T>。這是LINQ中非通用IEnumerable作爲參數(第二個是OfType)的兩種方法之一,因此您可以擁有給定類型的集合,將其轉換爲IEnumerable<T>並使用其他需要IEnumerable<T>作爲參數的LINQ方法。

試想一下,在源代碼

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) { 
    IEnumerable<TResult> typedSource = source as IEnumerable<TResult>; 
    if (typedSource != null) return typedSource; 
    if (source == null) throw Error.ArgumentNull("source"); 
    return CastIterator<TResult>(source); 
} 

CastIterator

foreach (object obj in source) yield return (TResult)obj; 

所以您的收藏應該能夠以被強制轉換爲特定類型TCast工作。它不會將您的匿名類型轉換爲具體的類型。

+0

哇,這很深。我喜歡。 – Hogan

0

如果選擇實際的對象,然後這就是你回來作爲集團的IEnumerable什麼:那麼

var groups = new List<Group>(); 
var groupManager = (from a in db.AUsers 
          join b in db.BUsers on a.Id equals b.UserID into group1 
          from g1 in group1.DefaultIfEmpty() 
          join c in db.UserRoles on g1.ID equals c.UserID into group2 
          from g2 in group2.DefaultIfEmpty() 
          join d in db.Roles on g2.RoleID equals d.ID into group3 
          from g3 in group3.DefaultIfEmpty() 
          join e in db.RoleGroups on g3.ID equals e.RoleID into group4 
          from g4 in group4.DefaultIfEmpty() 
          join f in db.Groups on g4.GroupID equals f.ID into group5 
          from g5 in group5.DefaultIfEmpty() 
          where a.Id == user.ID && g5.Name != "" 
          select g5).ToList() 
groups = groupManager; 

的.ToList()將其轉換爲一個列表。無需創建動態對象,然後投射。

相關問題