先吐槽一下,EF7 目前来说,真对的起现在的版本命名:"EntityFramework": "7.0.0-beta1"。

这篇博文纪录一下:当 Linq 查询中使用 Join 语句,然后获取 Count 的时候会报错,而使用 LongCount 却没有任何问题。

BloggingContext 配置代码:

using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Metadata;
using System.Collections.Generic; namespace EF7
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<BlogCate> BlogCates { get; set; } protected override void OnConfiguring(DbContextOptions builder)
{
builder.UseSqlServer(@"Server=.;Database=Blogging;Trusted_Connection=True;");
} protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Blog>()
.Key(b => b.BlogId);
builder.Entity<BlogCate>()
.Key(b => b.CateId);
}
} public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public int BlogCateId { get; set; }
}
public class BlogCate
{
public int CateId { get; set; }
public string CateName { get; set; }
}
}

BloggingContext 的配置很简单,只有 Blog 和 BlogCate 两个实体,注意我在 OnModelCreating 映射配置的时候,并没有使用 OneToMany 进行外键映射配置,测试代码:

[Fact]
public void ConutTestNoJoin()
{
using (var context = new BloggingContext())
{
var query = from b in context.Blogs
select b;
var countLog = query.LongCount();
var count = query.Count();
}
}

测试结果:

SQL Server Profiler 捕获 SQL 代码:

exec sp_executesql N'SELECT COUNT(*)
FROM [Blog] AS [b]
WHERE [b].[Url] = @p0',N'@p0 nvarchar(23)',@p0=N'http://www.cnblogs.com/'

注意 Blogs 表中时没有任何数据的,上面测试代码简单的不能再简单了,当然测试结果没什么问题,生成 SQL 代码也是我们想要的格式(COUNT(*)),这种查询时我们一般常用的 Linq 查询方式,也就是查询单个实体集的 Count,还有一种场景是使用 join 关联,然后进行 Where 条件限制,主要是对主表的限制,然后查询主表符合条件的个数,这种场景我们应该使用 Linq 查询时候也会经常遇到,比如下面测试代码:

[Fact]
public void ConutTestWithJoin()
{
using (var context = new BloggingContext())
{
var query = from b in context.Blogs
join c in context.BlogCates on b.BlogCateId equals c.CateId
where b.Url.Equals("http://www.cnblogs.com/") && c.CateName.Equals("ef7")
select b;
var countLog = query.LongCount();
var count = query.Count();
}
}

上面测试代码中,我对 BlogCates 中的 CateName 进行了“ef7”的条件限制,测试结果:

详细异常信息:

Expression of type 'System.Data.Common.DbDataReader' cannot be used for parameter of type 'Microsoft.Data.Entity.Query.QuerySourceScope' of method 'Microsoft.Data.Entity.Query.QuerySourceScope`1[Microsoft.Data.Entity.Metadata.IValueReader] CreateValueReader(Remotion.Linq.Clauses.IQuerySource, Microsoft.Data.Entity.Query.QueryContext, Microsoft.Data.Entity.Query.QuerySourceScope, System.Data.Common.DbDataReader)'

SQL Server Profiler 捕获 LongCount 生成的 SQL 代码:

exec sp_executesql N'SELECT [b].[BlogCateId], [b].[BlogId], [b].[Url]
FROM [Blog] AS [b]
INNER JOIN [BlogCate] AS [c] ON [b].[BlogCateId] = [c].[CateId]
WHERE ([b].[Url] = @p0 AND [c].[CateName] = @p1)',N'@p0 nvarchar(23),@p1 nvarchar(3)',@p0=N'http://www.cnblogs.com/',@p1=N'ef7'

LongCount 生成的这段 SQL,你如果仔细观察的话,其实也有问题,我们使用 Linq 明明写的是 LongCount 语句,生成的 SQL 代码应该和我们第一个测试代码生成的一样,也就是 COUNT(*),有可能你认为是 SQL Server Profiler 捕获 SQL 代码问题,你也可以使用 EF7 自己提供的 SQL 代码纪录方式:EntityFramework 7 如何查看执行的 SQL 代码?,测试之后,你会发现:生成的 SQL 和 SQL Server Profiler 是一样的,之前遇到的 short 类型字段生成也是这样,当然我个人觉得可能还有一些其他的 Linq 语句不能被“翻译”,只是现在还未发现而已,捕获生成的 SQL 代码,EF7 确实需要完善下,如果你使用 EF7 觉得这些语句“不安全”的话,你可以只看测试结果就行了,毕竟生成 SQL 只是作为参考,测试结果才是最准确的。

回到 Count 报错问题上来,这个问题也花了我一些时间,我一开始认为是 join 关联实体 where 条件的问题,然后我把 join 的 where 条件去掉,发现还是会报错,异常提示大概是说参数类型的问题,具体我也不知道是哪边的问题,反正异常提示信息就这么多。而使用 LongCount 是我无意间发现的,因为之前我们获取数量都是使用的 Count 语句,反正我是不知道有个 LongCount,使用 query. 下拉看可以访问到东西的时候,就无意间发现还有个 LongCount,然后没抱希望的试了下,居然可以???然后我就很奇怪,我查询出来的结果集数量总共不到几百,远远还没达到 Long 的级别,然后新建测试项目,最后发现还是会出现这个问题,这边只能纪录一下这个“奇怪”的问题。

对于我来说,好消息是:开发项目中可以使用 LongCount,来避免 Count 报错问题,但总感觉心里不踏实,这种 join where 条件限制来获取 Count 的方式,我们应该会经常用到,如果你看出是哪方面问题了,还请指教,感谢!


已提交至 EntityFramework 7 issues:Use EF7, Linq Join Count is error

EntityFramework 7 Join Count LongCount 奇怪问题的更多相关文章

  1. EntityFramework 7 Join Count LongCount 奇怪问题(已修复)

    问题说明: 博客问题纪录 Use EF7, Linq Join Count is error EF7 Code Commit EF7 版本(注意 rc): 旧版本:"EntityFramew ...

  2. EntityFramework 7 Left Join Where Select 奇怪问题

    这篇博文纪录一下:使用 EF7,当 Linq 查询中使用 "Left Join" 语法(DefaultIfEmpty),Where Select 不同条件语法实现,出现的不同问题. ...

  3. EntityFramework 7 Linq Contains In 奇怪问题(已修复)

    问题说明: 博客问题纪录 Use EF7, Linq Contains In is error. EF7 Code Commit adding (client side) support for Co ...

  4. EntityFramework 7 Linq Contains In 奇怪问题

    这篇博文纪录一下:当使用 EF7,Linq 实现类似 where filename in('','','') SQL 代码,使用 Contains 出现报错问题. project.json 配置文件( ...

  5. EntityFramework left join

       var result = from u in db.Order                              join n in db.Equipment on u.OrderId  ...

  6. 爱与恨的抉择:ASP.NET 5+EntityFramework 7

    EF7 的纠缠 ASP.NET 5 的无助 忘不了你的好 一开始列出的这个博文大纲,让我想到了很久之前的一篇博文:恋爱虽易,相处不易:当EntityFramework爱上AutoMapper,只不过这 ...

  7. ASP.NET 5+EntityFramework 7

    爱与恨的抉择:ASP.NET 5+EntityFramework 7   EF7 的纠缠 ASP.NET 5 的无助 忘不了你的好 一开始列出的这个博文大纲,让我想到了很久之前的一篇博文:恋爱虽易,相 ...

  8. EntityFramework 7 Left Join Where is error(Test record)

    First of all, my English is very poor, so I may not be a very good expression, very sorry! In this b ...

  9. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

随机推荐

  1. 学习angular2

    最近在学angular2,并没有很深入,跟着官网做了一份练习,整理了一下,画了一个简单的结构图.

  2. Redis集群最佳实践

    今天我们来聊一聊Redis集群.先看看集群的特点,我对它的理解是要需要同时满足高可用性以及可扩展性,即任何时候对外的接口都要是基本可用的并具备一定的灾备能力,同时节点的数量能够根据业务量级的大小动态的 ...

  3. 取消TableViewCell选中状态的外观变化

    tabelViewcell 使用Xib创建自定义外观的时候,在tableview选中的时候,cell的外观会发生变化,在定义Xib中如下图将选中的外观状态取消掉 也有其他选项,可以选择控制选中的时候的 ...

  4. (学)解决诡异的 Exception type: SocketException 127.0.0.1:80

    许久不发博了,老杨听完故事让我持续写一下“十万个为什么” 一.背景:  昨天我们亲密的战友HH刘老板亲临现场,指出我们协用的一个项目,客户方面反馈手持终端系统不定期“卡死”,要我们安排人飞到广州驻场解 ...

  5. jQuery弹出提示信息简洁版(自动消失)

    之前看了有一些现成的blockUI.Boxy.tipswindow等的jQuery弹出层插件,可是我的要求并不高,只需要在保存后弹出提示信息即可,至于复杂点的弹出层-可以编辑的,我是直接用bootst ...

  6. 使用Gemini构建自己的IDE

    你的项目中的领域特定语言是否需要自己的IDE?Visual Studio Shell是选择之一,但是过于庞大不易部署,而且很难使用.Tim Jones的Gemini框架是一个轻量级替代方案. Gemi ...

  7. 使用VS2013分析DMP文件

    当一个发布的.NET应用程序出现app crash,无法通过日志分析异常原因时,就需要通过分析DMP文件了,传统方式是通过WinDbg来分析DMP文件,但是WinDbg用起来不是很方便,其实VS就是一 ...

  8. 【转】我的技术学习方法 — Anytao

    原文作者:anytao—王涛 他的著作:<你必须知道的.Net> 关于这个问题,也有不少刚刚入行的朋友向我问起.我想可能一千个人就有一千个答案,我不能保证自己的想法适合于所有的人,但是这确 ...

  9. MySQL 分析服务器状态

    标签:MYSQL/数据库/性能优化/调优 概述 文章简单介绍了通过一些查询命令分析当前服务器的状态. 目录 概述 获取服务器整体的性能状态 SQL操作计数 总结 步骤 获取服务器整体的性能状态 首先对 ...

  10. WCF basicHttpBinding之Transport Security Mode, clientCredentialType="None"

    原创地址:http://www.cnblogs.com/jfzhu/p/4071342.html 转载请注明出处 前面文章介绍了<WCF basicHttpBinding之Message Sec ...