使用场景

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

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类型,编译通过了运行也会报错,如下:

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()。

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

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模型文件添加如下代码:

<Function Name="ConvertGuidToChar" ReturnType="varchar" Schema="dbo" >
<Parameter Name="id" Mode="In" Type="uniqueidentifier" />
</Function>

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

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

/// <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中使用自定义函数转换类型

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模型的,但是应该可以通过其他方式添加,我没试,我随便说的,你别信啊。

参考文档:

如何:调用自定义数据库函数

Linq查询连接guid与varchar字段的更多相关文章

  1. Linq查询条件里有可空字段比较时报错variable '<>h__TransparentIdentifier2' of type referenced from scope '', but it is not defined

    当我运行下面的linq查询时报了这个错,   1: var result = (from so in svcContext.new_sales_orderSet 2: join soitem in s ...

  2. mysql连接查询(A表某字段 like B表字段)

    假设有A.B两表 A表中有个字段column_aa B表中有个字段column_bb 如果需要查询出B表中字段column_bb like A表中column_aa字段的纪录,可以使用如下语句 sel ...

  3. Linq三表连接查询加分组

    1.Linq查询 2.数据库事例: 3.效果图:

  4. 转:LINQ查询返回DataTable类型

    动态绑定ReportViewer虽然之前实现过,但现在弄起来还是有点晕,主要是过去没有使用Linq,数据的操作经常用到DataTable,可以直接拿来使用,现在用Linq更方便,也懒得再用之前的数据库 ...

  5. asp.net linq查询环境搭建

    本文是以sqlserver2008为数据库,vs2013为开发工具来介绍的. 要搭建这样一个数据库的操作环境,首先建立一个类库项目 然后在这个类库项目中添加几个类:DBDataContext数据库上下 ...

  6. C#基础:LINQ 查询函数整理

    1.LINQ 函数   1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作 ...

  7. LINQ查询返回DataTable类型

    个人感觉Linq实用灵活性很大,参考一篇大牛的文章LINQ查询返回DataTable类型 http://xuzhihong1987.blog.163.com/blog/static/267315872 ...

  8. c# linq查询语句详细使用介绍

    本文介绍Linq的使用方法 linq介绍 LINQ只不过是实现IEnumerable和IQueryable接口的类的扩展方法的集合. LINQ可以查询IEnumerable集合或者IQueryable ...

  9. LINQ查询返回DataTable类型[轉]與将DataTable序列化为Json格式【轉】

    (原文地址:http://xuzhihong1987.blog.163.com/blog/static/26731587201101853740294/) LINQ查询返回DataTable类型 在使 ...

随机推荐

  1. Python 简单批量请求接口实例

    #coding:utf-8 ''' Created on 2017年11月10日 @author: li.liu ''' import urllib import time str1=''' http ...

  2. Centos7配置静态网卡

    1.打开VMware,查看ifconfig 2.进入网卡编辑 [root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhos ...

  3. SpringBoot之使用Druid连接池,SQL监控和spring监控

    项目结构 1.引入maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot< ...

  4. 数组(定义、遍历、冒泡排序、合并和Join 方法)

    一.数组的定义 1.理解:数组指一组数据,有序的数据,可以一次性存储多个数据,将多个元素(通常统一类型)按照一定的顺序排列放到一个集合里 2.通过构造函数创建数组: var 数组名=new Arrar ...

  5. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party 题解

    P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  6. CSS3 之loading动画实现思路

    效果大致如下: 主要实现方式: 该效果主要用到animation-timing-function中的steps()函数,该函数主要用于分步隐藏不同模块. 实现思路: 第一步动画: 第二步动画: 第三步 ...

  7. 基于python的学生管理系统(含数据库版本)

    这次支持连接到后台的数据库,直接和数据库进行交互,实现基本的增删查改 #!/usr/bin/python3 # coding=utf-8 """ ************ ...

  8. mysql sqrt() 函数

    mysql> ); +----------+ | sqrt() | +----------+ | | +----------+ row in set (0.00 sec)

  9. hosts 屏蔽定位域名

    通过修改hosts屏蔽定位服务的域名 #屏蔽百度地图 1.0.0.1 api.map.baidu.com 1.0.0.1 ps.map.baidu.com 1.0.0.1 sv.map.baidu.c ...

  10. 《恶魔人crybaby》豆瓣短评爬取

    作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159 爬虫综合大作业 选择一个热点或者你感兴趣的主题. 选择爬取的对象 ...