Linq To Entities 的自定义扩展方法
我想使用 Linq-To-Entities 对 SQL Server 2008 R2 数据库进行查询。
我使用实体框架 4.1(代码优先)
查询必须将实体的哈希值与参数进行比较,如下所示:
myContext.Messages.Where(m => HashCode(m.MessageId) % 10000 == myValue)
但我只能使用 为 EF 提供程序定义的核心扩展方法和 CLR 方法。
因此,我尝试在执行之前将我的 HashCode()
方法转换为 L2E 可以理解的方法。
仅供参考,HashCode 的实现并不复杂。类似于:
public int HashString(string text)
{
int hash = 23;
foreach (char c in text)
{
hash = hash * 31 + c;
}
return hash;
}
我知道我可以检索所有可枚举的实体,并在我的代码(Linq To Objects)中检查它们,但考虑到我要以这种方式检索的数据量,这是一场灾难。
它是否可行(对于 GetHashCode 方法)。如果可以,我该如何实施?
谢谢。
I'd like to make a query to my SQL Server 2008 R2 database using Linq-To-Entities.
I use Entity Framework 4.1 (Code-First)
the query has to compare the entities' hashed values with a paramater as follows:
myContext.Messages.Where(m => HashCode(m.MessageId) % 10000 == myValue)
But I can only use core extension methods and CLR methods defined for the EF provider.
So I'm trying to translate my HashCode()
method to something that L2E understands just before execution.
FYI, HashCode's implementation is not complex. something like:
public int HashString(string text)
{
int hash = 23;
foreach (char c in text)
{
hash = hash * 31 + c;
}
return hash;
}
I know I can retrieve all the entities as enumerable and check them in my code (Linq To Objects), But that's be a disaster considering the amount of data I'm about to retrieve that way.
Is it doable at all (for GetHashCode
method). If so, how can I implement it?
Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你能写 SQL 来做到这一点吗?我不明白如何(没有 SQL 函数,这需要修改数据库模式,你说你不能这样做)。
如果你不能在 SQL 中做到这一点,那么你当然也不能在 L2E 中做到这一点,因为所有 L2E 都被翻译为 SQL。
另一方面,如果您可以使用 SQL 来完成此操作,那么最快的解决方案可能是
ObjectContext.ExecuteStoreQuery
。Could you write SQL to do this? I don't see how (without a SQL function, which requires modifying DB schema, which you say you can't do).
If you can't do it in SQL, you certainly can't do it in L2E, since all L2E is translated to SQL.
On the other hand, if you can do it in SQL, the fastest solution is probably
ObjectContext.ExecuteStoreQuery
.