前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linq查询连接guid与varchar字段

Linq查询连接guid与varchar字段

作者头像
用户6362579
发布2019-09-29 17:06:03
1.2K0
发布2019-09-29 17:06:03
举报
文章被收录于专栏:小神仙小神仙

使用场景

在数据库设计中进场会出现一些通用表,如通用附件表,一般都是通过ForeignTable(关联的表名)和ForeignKey(关联表的主键)与其他表关联。这样的表在数据库中没有外键关系,而且一般ForeignKey的类型是varchar,为了兼容其他表的主键可能不一样。这样在Linq查询的时候就不能直接关联了,如下代码会编译不通过:

代码语言:javascript
复制
from a in db.WorkflowInstance
join b in d.xxx//xxx.ID为guid类型
on new { a.ForeignTable, a.ForeignKey } equals new { ForeignTable = nameof(xxx), ForeignKey = b.ID }
select a;

因为xxx.id是Guid(uniqueidentifier)类型和WorkflowInstance.ForeignKey是string(varchar)类型。就算是强行把xxx.id转成string类型,编译通过了运行也会报错,如下:

代码语言:javascript
复制
from a in db.WorkflowInstance
join b in d.xxx//xxx.ID为guid类型
on new { a.ForeignTable, a.ForeignKey } equals new { ForeignTable = nameof(xxx), ForeignKey = b.ID+"" }
select a;

以为这段代码最终都会转成sql语句,而Guid是不能直接转换成varchar的。

解决方案

如果xxx.id是数字类型(int,float,double,decimal)是可以使用SqlFunctions.StringConvert(xxx.id)转换成string类型,这样就可以了,SqlFunctions.StringConvert支持double和decimal,基本上数字都可以转换成这两种类型,但是注意下转换时小数点后0的个数,因为string比较时少一个0是不一样的。 但是Guid不行,因为没有对应的函数。通过面向百度编程,微软爸爸给我们提供了一个解决方案:自定义函数。相当于我们自己实现一个SqlFunctions.StringConvert()。

首先在数据库定义一个转换函数

代码语言:javascript
复制
if EXISTS(select * from dbo.sysobjects where id = object_id(N'[dbo].[ConvertGuidToChar]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].ConvertGuidToChar
GO
CREATE FUNCTION ConvertGuidToChar
(
    @id UNIQUEIDENTIFIER
)
RETURNS VARCHAR(50)
AS
BEGIN
    RETURN CONVERT(VARCHAR(50),@id)
END

把函数添加到db模型

可以直接编辑edmx模型文件添加如下代码:

代码语言:javascript
复制
<Function Name="ConvertGuidToChar" ReturnType="varchar" Schema="dbo" >
  <Parameter Name="id" Mode="In" Type="uniqueidentifier" />
</Function>

也可通过从数据库更新模型添加

添加自定义函数对应的方法

代码语言:javascript
复制
/// <summary>
/// sql函数Guid转varchar
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[EdmFunction("iLISModel.Store", "ConvertGuidToChar")]
public static string ConvertGuidToChar(Guid id)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

Linq中使用自定义函数转换类型

代码语言:javascript
复制
from a in d.WorkflowInstance
join b in d.xxx//xxx.ID为guid类型
on new { a.ForeignTable, a.ForeignKey } equals new { ForeignTable = nameof(xxx), ForeignKey =  SqlFunctionsExtension.ConvertGuidToChar(b.ID) }
select a;

这样就能正常查询数据了。 注:codefirst是没有edmx模型的,但是应该可以通过其他方式添加,我没试,我随便说的,你别信啊。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用场景
  • 解决方案
    • 首先在数据库定义一个转换函数
      • 把函数添加到db模型
        • 添加自定义函数对应的方法
          • Linq中使用自定义函数转换类型
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档