基于EF(Entity Framework)的分层系统中如何传递查询的结果集

在基于Entity Framework的分层系统中,遇到如何传递查询结果集的问题。最初尝试将查询结果作为匿名类型返回,发现匿名类型只能作为局部变量存在,无法跨作用域。然后尝试将结果转换为object类型,但GridView无法绑定。最后,通过使用LINQ的Cast函数,将匿名类型转换为已知的强类型,解决了问题。示例展示了Cast函数的使用,强调了在定义新类型时,`new`关键字后的类型声明不能省略。
摘要由CSDN通过智能技术生成

接触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 后面的类型有些资料中省略了,但我在自己的环境中省略后编译没有通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值