Entity Framework 4.0新增对T-SQL的支持

Entity Framework 4.0新增对T-SQL的支持

 

 

Entity Framework 4.0新增对T-SQL的支持

EF4.0中新增了ExecuteStoreQuery,ExecuteStoreCommand,ExecuteFunction等方法,完美支持T-SQL

之前在EF中用Linq进行left join查询和报表数据查询简直是一场噩梦,以下代码就是例子:

Linq左连接查询N张表示例代码:

public List<Info> getMapUnitList(int MapId)
{
var var1 = from mu in epm.MapUnit
join us in epm.UnitStatus
on mu.Unit equals us.Unit into _UnitStatus
join cu in epm.ContractUnit
on mu.Unit equals cu.Unit into _ContractUnit
where mu.Map.MapId == MapId
select new Info()
{
map = mu.Map
mapstatus = null
mapunit = mu
unit = mu.Unitstatus = _UnitStatus.Select(a => a.Status).FirstOrDefault()
contract = _ContractUnit.Select(a => a.Contract).FirstOrDefault()
customer = null

boothtype = null
};
var var2 = from v1 in var1
join ms in epm.MapStatus
on new { map = v1.map, status = v1.status }
equals new { map = ms.Map, status = ms.Status } into _MapStatus
select new Info()
{
map = null
mapstatus = _MapStatus.FirstOrDefault()
mapunit = v1.mapunit
unit = v1.unit
status = v1.status
contract = v1.contract
customer = null
boothtype = null
};
var var3 = from v2 in var2
from ubtl in epm.UnitBoothType
where ubtl.Unit.UnitId == v2.unit.UnitId
join cc in epm.CustomerContract
on v2.contract equals cc.Contract into _CustomerContract
select new Info()
{
map = null
mapstatus = v2.mapstatus
mapunit = v2.mapunit
unit = v2.unit
status = v2.status
contract = v2.contract
customer = _CustomerContract.Select(a => a.Customer).FirstOrDefault()
boothtype = ubtl.BoothType
};
List<Info> infos = var3.ToList();
return infos;
}

后来加入了E-SQL,但还是和T-SQL有很大区别,我看到那一堆 as 和 it 就想给挖掉 :)

EF 4.0新增加了对T-SQL的支持,根据T-SQL语句查询结果集中的列名自动映射到返回类型的属性名

甚至连EDM文件不支持映射的sql_varent类型也可以自动转换了,代码如下:

ExecuteStoreQuery方法:

protected void Page_Load(object sender, EventArgs e)
{
ERPEntities erp = new ERPEntities();
string query = @" SELECT [BillPlanRule].[id] as BillID
,qu.UnitNumber
,[BeginDate]
,[EndDate]
,ft.value as FeeType
,f.value as Frequency
,[Price]
,[ActualPrice]
,[Fee]
FROM [BillPlanRule]
left join dbo.SysParameter as ft
on [BillPlanRule].[FeeType]=ft.guid
left join dbo.SysParameter as f
on [BillPlanRule].[Frequency]=f.guid
left join dbo.QuotationUnit as qu
on [BillPlanRule].[UGuid]=qu.guid
where uguid in (select guid from dbo.QuotationUnit
where QuotationGuid in (select guid from dbo.Quotation where id=3) )
order by BillID";
ObjectResult<SysParameter> result = erp.ExecuteStoreQuery<SysParameter>(query);
List<SysParameter> list = result.ToList();
}

public class SysParameter
{
public int? BillID { get; set; }
public DateTime? BeginDate { get; set; }
public DateTime? EndDate { get; set; }
public string FeeType { get; set; }
public string Frequency { get; set; }
public decimal? Price { get; set; }
}

其中FeeType和Frequency在数据库中的类型都为sql_varent

ExecuteStoreQuery方法调用时并不是实时连接数据库查询,而是在下一句result.ToList()时才真正去查询

此方法很适合做复杂查询和报表查询,如根据各种不同条件拼接sql字符串的查询

欢迎访问微软官网下载相关软件http://www.microsoft.com/zh/cn/default.aspx

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值