使用场景

在数据库设计中进场会出现一些通用表,如通用附件表,一般都是通过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. 项目Alpha冲刺总结随笔

    班级:软件工程1916|W 作业:项目Alpha冲刺 团队名称:SkyReach 目标:完成项目Alpha版本 项目Github地址 团队博客汇总 队员学号 队员姓名 个人博客地址 备注 221600 ...

  2. 深度学习Keras框架笔记之TimeDistributedDense类

    深度学习Keras框架笔记之TimeDistributedDense类使用方法笔记 例: keras.layers.core.TimeDistributedDense(output_dim,init= ...

  3. msdtc不可用

    在使用“经销商园地 网上订单处理程序”等程序时,如果程序报:服务器×××上的MSDTC不可用”,可以按照以下方法进行解决: 在windows控制面版-->管理工具-->服务-->Di ...

  4. java 数组逆序输出(方法内部的代码)

    //现在数组中有1, 2, 4, 5, 6, 7, 8 请逆序输出 int [] arrs={1,2,3,4,5,6,7,8}; for(int i=arrs.length-1;i>-1;i-- ...

  5. 2019.12.10 switch(){ case: }

    if 适合判断范围 switch 适合判断某个值 两种方法: import java.util.Scanner; class Demo02 { public static void main(Stri ...

  6. 开源项目 06 NPOI

    using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using S ...

  7. Go-Json操作

    /** * @Author: jadeshu * @Description: * @File: main * @Version: 1.0.0 * @Date: 2019/11/7 2:33 */ pa ...

  8. 树莓派基于scratch2控制GPIO

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/raspberry_scratch2_gpio_control.m ...

  9. C Primer Plus--高级数据结构之二叉树

    目录 二叉搜索树 Binary Search Tree 用C构建二叉树ADT 树结构的定义 C Primer Plus--高级数据结构表示之二叉树 二叉搜索树 Binary Search Tree 二 ...

  10. 使用IDEA查看变量调用链

    在开发中,我们有时需要查看某个变量是怎么来的,从哪个类的某个方法调用后进入另一个类的某个方法. 如果只有一两层的调用,那么还能直接通过方法跳转来观察. 但是,如果有七八层的调用链呢,在各个方法之间跳来 ...