如何在Entity Framework中的guid上使用SQL的LIKE?

时间:2013-01-02 08:00:51

标签: sql-server entity-framework c#-4.0 guid

在SQL Server中,uniqueidentifier列可以像LIKE比较的字符串一样使用:

SELECT * FROM dbo.Table WHERE GuidColumn LIKE '4c38e01e%'

如何在Entity Framework中使用此功能?

我想要这样的东西

context.Table.Where(x => x.StringColumn.Contains("some string"))

但是对于Guid列而不是字符串列:

context.Table.Where(x => x.GuidColumn ???? "4c38e01e")

2 个答案:

答案 0 :(得分:3)

据我所知,在EntityFramework中无法将Guid转换为字符串。 我知道一些工作方式,但它们对我来说并不优雅,尽管它们对你的情况有帮助:

  1. 在SQL Server中创建一个视图,将Guid列转换为字符串。然后创建一个新实体并将其映射到视图。现在你有一个字符串represantation你的guid列,可以应用'like'运算符。主要缺点是查询性能。
  2. 创建字符串类型的PERSISTENT计算列。使用convert表达式将Guid转换为字符串。查询性能与普通字符串列相同,但将记录插入表中需要更长的时间。
  3. 如果这不是应用于您的数据源的唯一过滤器,那么当数据已经在内存中时,您可以应用GUID LIKE操作。
  4. 希望它有所帮助。

答案 1 :(得分:2)

我通过在数据库中创建存储过程来解决这个问题,该存储过程处理数据库中的'like'子句,并将过程结果映射到我的实体从edmx。所以我的存储过程是:

CREATE PROCEDURE [dbo].[spGetDevicesWhereGuidContains] 
@partialGuidString as varchar (5)

AS
BEGIN
    SET NOCOUNT ON;
    SELECT * from devices where [Guid] like '%' + @partialGuidString + '%'
END

然后,将proc从模型浏览器映射到实体: http://entityframeworktutorial.net/data-read-using-stored-procedure.aspx#.UT0F96GG1e4

然后从那里显而易见;

List<Device> devices = context.spGetDevicesWhereGuidContains("8").ToList();

不理想,但是做到了。