使用Linq 2 EF,如何找到以'x'开头的guid?

时间:2011-05-02 21:13:37

标签: .net linq entity-framework

使用Linq2Entities(EF4),我需要查询具有Guid属性的实体(称之为id)。我需要查询我的实体是否有任何以id开头的给定前缀的记录。

从本质上讲,我需要像

这样的东西
from items in myEntity 
where items.id.ToString().StartsWith(prefix)
// rest of the query

现在,我知道L2EF不支持使用Guid转换ToString()成员。

SqlFunctions.StringConvert()助手不支持它,因为它不接受Guid参数。

我无法使用SQL LIKE,如

from items in myEntity 
where items.id like 'prefix%'

因为L2EF也不支持它。

到目前为止我发现的所有建议都建议使用Contains(),但这与starts with完全不同....例如Guid s的情况,前8个字符可能在最后13个字符中找到。

那么,您如何使用L2EF查询具有以“前缀”开头的Guid的记录?

我可以想到一些黑客,比如将后端SQL数据库上的uniqueidentifier字段转换为varchar(),但我真的很想知道我是否只是在做错之前这样的事情。

2 个答案:

答案 0 :(得分:4)

两种选择: 1)更改您的实体数据模型,以便无论“x”表示什么,它都会移动到该实体上的属性,而不是紧密耦合到唯一ID

2)将整个实体列表放入一个集合中,然后在将它们加载到内存后,通过并对集合执行id.ToString()。Contains()查询。一旦将其加载到内存中,CLR就会允许这样做。虽然,可怕的开销。

如果可能,我会选择#1。

答案 1 :(得分:1)

在您的上下文中使用ExecuteStoreQuery并直接针对您的上下文执行自定义SQL语句。类似的东西:

string prefix = '00000000';       
const string sql = "select * from myEntities where id like @prefix + '%'"; 
var matches = context.ExecuteStoreQuery<MyEntityType>(sql, prefix);

另外,请查看此MSDN example