EF学习杂记31:如何在EF查询中引入外部函数

假设你需要书写如下的查询脚本代码:

var possibleBuyers=
     from p in ctx.People
     where p.Address.City == “Sammamish” && InMarketForAHouse(p)
     select p;

理论上,上面的代码需要有一个SQL翻译方法来解析InMarketForAHouse方法。

Now theoretically this is possible so long as there is a SQL translation for InMarketForAHouse.

在EF4.0中,你素要为需要的模型或者数据库编写CLR存储器。

In EF 4.0 you do this by creating a CLR stub for the required Model or Database function.

假设没有SQL翻译,或许函数需要使用一些数据库中没有的对象,所以你现在需要把LINQ语句拆分成两个部分,一部分是用于Entity查询的基础语句部分,另一部分是依赖于对象查询的依赖语句部分。

你可以尝试着如下的写法:

You might try something like this:

var partialFilter = from p in ctx.People
                    where p.Address.City == “Sammamish”
                    select p;

var possibleBuyers = from p in partiallyFilter
                     where InMarketForAHouse(p);
                     select p;

但是上面的写法并没有实质性的变化,IQueryable (ctx.People)将依然需要一个翻译机制来翻译InMarketForAHouse(..)方法。

你需要调用AsEnumerable()方法,来隔离上面的两部分语句:

var possibleBuyers = from p in partiallyFilter.AsEnumerable()
                     where InMarketForAHouse(p);
                     select p;

AsEnumerable() 方法用LINQ to Objects的语法接管了所有的子查询请求,因此LINQ to Entities将不会再要求翻译InMarketForAHouse(..).方法。

下面还有需要注意的地方:

你可能为了或其少量的数据结果要从数据库中先检索出大量的数据,这将会对性能有所影响,所以在进行查询的时候,要让你自己知道你需要取多少数据出来enumerating。问题是ObjectContext不仅仅默认执行了当前对象的enumerating,它还会自动加载相关的其他对象,当然这个特殊的问题可以通过使用NoTracking查询加以克服,但你会遇到其他的问题,你将在加载这些其他对象以后才可以执行更新操作。所以这里需要一下权衡。

转载于:https://www.cnblogs.com/brusehht/archive/2010/08/27/1809913.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值