2013-07-11 43 views
1

我有這樣的查詢代碼在這裏:LINQ的拉姆達實體,不包含定義

//Get all records based on ActivityID and TaskID. 
public IList<Model.questionhint> GetRecords1(int listTask, int listActivity) 
{ 
    IList<Model.questionhint> lstRecords = context.questionhints.ToList(); 
    return lstRecords.GroupBy(x => new { x.QuestionNo, x.ActivityID, x.TaskID }).Where(a => a.TaskID == listTask && a.ActivityID == listActivity).ToList(); 
} 

錯誤在於.Where聲明,它說,不包含定義ActivityIDTaskID

完整的錯誤:

「System.Linq.IGrouping」不包含關於「ActivityID」和沒有擴展方法「ActivityID」接受類型「System.Linq.IGrouping」的第一個參數可以定義找到(是否缺少using指令或程序集引用?)

我在查詢語句弱,基本上我想從數據庫中檢索記錄,其中活動ID =東西和任務ID =東西,他們組由questionNo,activityId和Task ID。

+0

btw;如果'context'是一個像LINQ-to-SQL,EF等提供者那麼'IList lstRecords = context.questionhints.ToList();'是一個真的***不好的想法 - 這迫使它加載整個表,在'where'等之前 - 並切換到LINQ到對象。我編輯了我的答案,以顯示如何避免 –

回答

2

將其更改爲Where(a => a.Key.TaskID == listTask && a.Key.ActivityID == listActivity)

你正在處理一個IGrouping,它的主要特性是匿名對象new { x.QuestionNo, x.ActivityID, x.TaskID }

這解決了原來的錯誤,但現在我們正在試圖返回IGroupings,這是不是正確的返回類型。一個更乾淨的方法是

var groups = lstRecords.GroupBy(x => new { x.QuestionNo, x.ActivityID, x.TaskID }).Where(a => a.Key.TaskID == listTask && a.Key.ActivityID == listActivity); 
IList<Model.questionhint> questionHints = new List<Model.questionhint>(); 
foreach(var group in groups) 
{ 
    questionHints.AddRange(group); 
} 
return questionHints; 

請注意,此代碼未經測試。你可以做到這一切在一個LINQ線(如IM肯定馬克會),但是我傾向於如果你的目標是讓所有符合條件的questionHints分裂它的可讀性

替代

,簡單的Where子句有什麼問題?

lstRecords.Where(a=>a.TaskID == listTask && a.ActivityID == listActivity).ToList(); 

參考
http://msdn.microsoft.com/en-us/library/bb344977.aspx

+0

感謝您的快速回復,做了上述我有這個錯誤:不能隱式轉換類型'System.Collections.Generic.List >'to'System.Collections.Generic.IList '。存在明確的轉換(您是否遺漏了演員?) – user2376998

+1

問題是Where子句返回IEnumerable>(忽略類型)。 IGrouping是IEnumerable,但即使我們簡化它變成IEnumerable ,您需要將它們彙總在一起,然後再返回它們。這將解決現在的問題,但它遠離最有效的方式(或可讀的方式)來做到這一點。 –

+0

它是因爲我的數據庫hv的許多記錄屬於同一個問題否,taskid和activityid,所以我需要將它們分組以便將它們分開。 http://stackoverflow.com/questions/17584451/arranging-in-order-with-reference-to-a-column這是我的表 – user2376998

3

最簡單的解決這裏是:過濾器(如果)你組之前;這也將減少分組必須做的工作:

return context.questionhints 
    .Where(a => a.TaskID == listTask && a.ActivityID == listActivity) 
    .GroupBy(x => new { x.QuestionNo, x.ActivityID, x.TaskID }) 
    .ToList(); 

它不是在你原來的代碼工作的原因,前面已經提到的,GroupBy返回的序列 - 每一個有一個.Key(你的匿名類型),並且它自己是那個組的序列。

但是!你的方法聲稱返回IList<Model.questionhint>;您的分組數據不會,也不會是,IList<Model.questionhint> - 它將是一個IList<IGrouping<{some anonymous type, Model.questionhint>>。因此:如果您聲稱它是IList<Model.questionhint> - 並且由於分組是匿名類型,因此您不能組,因爲您不能更改匹配的返回類型。你有兩個選擇:

  • 不羣
  • 組由申報的東西(自定義類型,或Tuple<...>),並更改返回類型匹配

例如:

public IList<IGrouping<Tuple<int,int,int>,Model.questionhint>> 
     GetRecords1(int listTask, int listActivity) 
{ 
    return context.questionhints 
     .Where(a => a.TaskID == listTask && a.ActivityID == listActivity) 
     .GroupBy(x => Tuple.Create(x.QuestionNo, x.ActivityID, x.TaskID)) 
     .ToList(); 
} 
+0

我之前嘗試過,錯誤在於ToList(); – user2376998

+0

@ user2376998啊;不,錯誤在於返回錯誤的數據形狀 - 我將在編輯中進行澄清 –