1

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

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

如何在实体框架中使用此功能?

我想要这样的东西

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

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

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

2 回答 2

4

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

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

希望能帮助到你。

于 2013-01-02T09:10:34.957 回答
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();

不理想,但可以完成工作。

于 2013-03-11T01:19:33.283 回答