EF.Core 使用Linq的Contact联合查询问题

这篇具有很好参考价值的文章主要介绍了EF.Core 使用Linq的Contact联合查询问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在.net Core 5 WebAPI 项目中应用 EF Core 5 实体框架,使用Linq的Contact联合进行多表查询。

定义两个子查询语句,查询结果 select 返回的对象结构类型都是一致的。

var query1 = from auth in Context.Authentications
              where auth.Status == 1
              select new ComplainInfo
              {
                  UserId = auth.UserId,
                  Reason = auth.Reason,
                  ReplyContent = "",
                  ReplyTime = (DateTime?)null
              };
                             
var query2 = from complaint in Context.DatingComplaints
              where complaint.Status = 1
              select new ComplainInfo
              {
                  UserId = complaint.UserId,
                  Reason = complaint.Reason,
                  ReplyContent = complaint.ReplyContent,
                  ReplyTime = complaint.ReplyTime
              };

//联合两个子查询
var query = query1.Contact(query2);

var items = await query.ToListAsync();

Linq查询结果集封装对象类:

public class ComplainInfo
{
    public long UserId { get; set; }
    public string Reason { get; set; }
    public string ReplyContent { get; set; }
    public DateTime? ReplyTime { get; set; }
}

DatingComplaint 实体类映射(Fluent API):

public class DatingComplaint
{
    public long Id { get; set; }
    public long UserId { get; set; }
    public string Reason { get; set; }
    public string ReplyContent { get; set; }

    public DateTime? ReplyTime { get; set; }
}

public class DatingComplaintEntity : IEntityTypeConfiguration<DatingComplaint>
{
    public void Configure(EntityTypeBuilder<DatingComplaint> builder)
    {
        builder
            .ToTable("DatingComplaint")
            .HasKey(o => o.Id);

        builder
            .Property(o => o.Id)
            .UseHiLo("DatingComplaintId")
            .IsRequired();

        builder
            .Property(o => o.UserId)
            .IsRequired();

       
        builder
            .Property(o => o.Reason)
            .HasMaxLength(1000)
            .IsRequired();

        builder
           .Property(o => o.ReplyContent)
           .HasMaxLength(1000)
           .IsRequired(false);

        builder
            .Property(o => o.ReplyTime)
            .IsRequired(false);   
    }
}

但在执行到 ToListAsync() 代码行查询返回结果时,抛出以下错误:

Unable to translate set operation when matching columns on both sides have different store types

经检查发现,query1 子查询中的 Replycontent 与 query2 子查询中的 ReplyContent 匹配列具有不同的存储类型,导致无法进行 union 集合查询操作。

从 DatingComplaint 实体类定义中可以看到,ReplyContent 属性同样使用 string 类型来定义, 与 Linq 查询结果集封装对象 ComplainInfo 中的 ReplyContent 属性都是使用 string 类型定义。若是从对象属性类型来看,很难判断出具有不同的存储类型的问题所在。

进行一步分析,既然是类型(string)一致,会不会字符串类型的长度不一致,导致进行 union 集合查询时 EF 认为是不同的存储类型?

实体类定义的 ReplyContent 属性映射的是可变室长的字符串类型(即:nvarchar(1000)),而类对象中的string类型 EF.core 会解析成最大长度的字符串类型(即: nvarchar(max))进行查询。

此时执行Linq查询时,就会产生匹配到列具有不同的存储类型的异常。

解决方案:

既然找到了是匹配列具有不同的存储类型的原因,将子查询语句中的列统一转换成相同类型再进行查询。

query1 查询语句中的 ReplyContent 非实体映射返回的属性值,EF.Core 解析生成列类型为 nvarchar(max)。可以将 query2 查询语句中 ReplyContent 实体映射返回的属性值类型(nvarchar(1000)),转换成 nvarchar(max)。

可以使用 Convert.ToString() 方法进行转换处理。

var query2 = from complaint in Context.DatingComplaints
              where complaint.Status = 1
              select new ComplainInfo
              {
                  UserId = complainUser.Id,
                  Reason = complaint.Reason,
                  ReplyContent = Convert.ToString(complaint.ReplyContent),
                  ReplyTime = complaint.ReplyTime
              };

执行Linq查询语句生成的SQL语句可以看到 对 ReplyContent 列进行了 nvarchar(max) 类型的转换,如下:

SELECT [a].[UserId], [a].[Reason], N'' AS [ReplyContent], NULL AS [ReplyTime]
FROM [Authentication] AS [a]
WHERE ([a].[Status] = 1) 
UNION ALL
SELECT [d].[UserId], [d].[Reason], CONVERT(nvarchar(max), [d].[ReplyContent]) AS [ReplyContent], [d].[ReplyTime]
FROM [DatingComplaint] AS [d]
WHERE [d].[Status] = 1

注:若两个实体对象使用相同属性类型(string)但字符串长度不一致时,也可以使用类型转换方式来处理。文章来源地址https://www.toymoban.com/news/detail-536780.html

到了这里,关于EF.Core 使用Linq的Contact联合查询问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#:了解LINQ,简化数据查询和操作的强大工具

    以下是 LINQ(Language Integrated Query)中常见的及其作用,并给出一个示例以展示其执行结果: from :用于指定数据源,可以是集合、数组、数据库表等。 示例: where :用于筛选满足指定条件的元素。 示例: select :用于选择返回的结果集。 示例: orderby :用于对结果集

    2024年02月12日
    浏览(61)
  • (十一)CSharp-LINQ-标准查询运算符(3)

    1、概念 标准查询运算符由一系列 API 方法组成,API 能让我们查询任何 .NET 数组或集合。 标准运算符的要点: 标准查询运算符使用方法语法。 一些运算符返回 Ienumerable 对象(或其他序列),而其他运算符返回标量。返回标量的运算符立即执行查询,并返回一个值,而不是一

    2024年02月11日
    浏览(37)
  • C# Linq 学会使用,学会自己编写Linq

    Linq我暂时理解为,一种内置的非常方便的数据查询的工具 我们先学习它的使用 //数据类 //新建了一个List数据,用来测试数据查询  //现在定义一个需求,需要查出 id2 的数据 引用Linq的命名空间  引用命名空间之后,我们的list对象,拥有了一个扩展方法,Where (扩展方法,在之前的博客

    2024年02月06日
    浏览(39)
  • C#中var关键字详解:强类型、匿名类型和LINQ查询的妙用!

      在C#中, var 是强类型的,因为它在编译时会根据变量的初始化表达式推断出变量的实际类型,并且一旦确定了类型,就不能再更改。这种类型推断是在编译时进行的,因此代码中的变量在运行时是具有明确定义类型的。 下面是一个简单的示例,说明 var 的强类型特性

    2024年02月01日
    浏览(57)
  • C#中LINQ的使用知多少?LINQ常功能整理,实例源代码解析

      LINQ(Language-Integrated Query)是C#语言中的一个强大的查询技术,它提供了一种统一的查询语法,可以用于查询和操作各种数据源,包括集合、数据库、XML等。下面详细描述了LINQ的20个功能点,并提供了相应的源代码。 查询集合中的所有元素: 使用条件过滤集合中的元素:

    2024年02月05日
    浏览(52)
  • c# 从零到精通 数据库 定义LINQ查询表达式,从数组中查找长度小于7的所有项

    c# 从零到精通 数据库 定义LINQ查询表达式,从数组中查找长度小于7的所有项 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LINQQuery { class Program { static void Main(string[] args) { //定义一个字符串数组 string[] strName = new string[] { “明日科技”,“C#编程词典”

    2024年02月10日
    浏览(48)
  • 使用Newtonsoft直接读取Json格式文本(Linq to Json)

    使用 Newtonsoft.Json(通常简称为 Newtonsoft)可以轻松地处理 JSON 格式的文本。Newtonsoft.Json 是 .NET 中一个流行的 JSON 处理库,它提供了丰富的功能和灵活性。 以下是使用 Newtonsoft.Json 进行 Linq to JSON 的示例代码: 首先,你需要在项目中安装 Newtonsoft.Json 包。你可以通过 NuGet 包管理

    2024年02月16日
    浏览(58)
  • C#中使用LINQ和lambda实现左链接、右链接、内链接

    在 C# 中使用 LINQ 和 lambda 表达式可以实现左链接(Left Join)、右链接(Right Join)和内链接(Inner Join)操作。这些链接操作是针对两个数据集合之间的关联查询,用于获取满足特定条件的匹配项。下面是使用 LINQ 和 lambda 表达式分别实现这些链接操作的示例: 假设我们有两个

    2024年02月16日
    浏览(34)
  • Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询

    同样还是 IModelCacheKeyFactory ,不过这次要采用主动刷新的方式。 动态实体,根据配置等生成动态类型来当作数据库实体使用,当配置修改时,可以调用 DynamicModelCacheKeyFactory.Refresh() 刷新DbContext。 动态构建部分不提供,我们将在其它的地方进行讨论。 我这里做了简化处理,直

    2024年02月03日
    浏览(37)
  • C#使用Linq和Loop计算集合的平均值、方差【标准差】

    标准差公式是一种数学公式。标准差也被称为标准偏差,或者实验标准差,公式如下所示: 样本标准差=方差的算术平方根=s=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/n) 总体标准差=σ=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/n ) 注解:上述两个标准差公式里的x为一组数(n个数据)的算术平均值

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包