基于EF(Entity Framework)的分层系统中如何传递查询的结果集
接触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 后面的类型有些资料中省略了,但我在自己的环境中省略后编译没有通过。