接觸EF快兩個月了,期間知道了什麼是LINQ,也接觸了不少c#3.0的新文法。
當然,也碰到了不少問題。。。
先來看一段代碼
linq
var result = from p in Database.StockDS
group p by p.ToModelnumber into g
//......以下省略
這是一句簡單的LINQ查詢語句,起初見到這樣的代碼時,我所想到的僅僅是,result的類型是由等號右邊的查詢語句決定的。 而當我需要將這個查詢結果,即result的值作為函數的傳回值時,我突然意識到一個問題,我該用什麼傳回型別呢?
我感到無從下手,想了半天我決定執行程式,並且在這句代碼前面打上斷點,看看這句代碼執行後VS是否會告訴我result到底是什麼類型,但是很可惜,VS只告訴我它是匿名的。
再次思考,又想了半天我想到了將result轉化成object類型傳遞,因為我需要將取得的資料繫結至GridView控制項,而GridView內部又有強大的反射機制,那麼即使我裝了箱之後拆不了,GridView也許仍然能夠綁定,但是很可惜,GridView表示它也無能為力。很顯然我誤解了反射。。。
再次思考,又想了半天我決定看看這個匿名類到底是個什麼東東。
這次我得到了一些資訊:
匿名型別只能作為局部變數存在,並且在在其作用範圍之外,編譯器無法得知其類型
(回憶的,記不清了,不過大致就是這個意思)
後半句是關鍵,不過可惜直到我注意到LINQ中的Cast函數後才意識到強制轉換這點上,解決方案也因為有了這個正確的關鍵詞才搜到
下面給出個簡單的例子:
public interface IStockStatistics
{
IT_Modelnumber ModelNumber { get; set; }
int TotalAmount { get; set ;}
}
public class StockStatistics:IStockStatistics
{
private int _id;
private IT_Modelnumber _model;
private int _amount;
public int Id
{
get{return _id ;}
set{_id =value ;}
}
public IT_Modelnumber ModelNumber
{
get { return _model; }
set { _model = value; }
}
public int TotalAmount
{
get { return _amount; }
set { _amount = value; }
}
}
1 public ICollection<IStockStatistics > GetStatistics()
2 {
3 var result = from p in Database.StockDS
4 group p by p.ToModelnumber into g
5 select new StockStatistics
6 {
7 Id = g.Key.Id,
8 ModelNumber = g.Key,
9 TotalAmount = g.Sum(p => p.Amount)
10 };
11 return result.AsEnumerable().Cast<IStockStatistics>().ToList().AsReadOnly();
12 }
簡單的說這個方法就是將原本匿名的類型轉換成我們已知的類型,但這個類型不存在,所以需要我們先進行定義。
select new StockStatistics :new 後面的類型有些資料中省略了,但我在自己的環境中省略後編譯沒有通過。