使用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()
,但我真的很想知道我是否只是在做错之前这样的事情。
答案 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。