有关一个linq语句的问题,求指点

aierda 2020-03-17 02:25:41
我起初在系统中使用的是ef core 2.1版本,下面的这条linq语句没有问题。

var query = (from a in _aRepository.GetAll()
.Where(t => t.TenantID.ToString() == teantID)
join b in _bRepository.GetAll()
on a.bID equals b.Id
select new B
{
Id = b.Id,
ParentID = b.ParentID,
Number = b.Number,
Name = b.Name,
UserName = a.StaffName
}).GroupBy(t => t.UserName).Select(t => new BDto()
{
Id = string.Join(",", t.Select(t => t.Id)),
ParentID = string.Join(",", t.Select(t => t.ParentID.ToString())),
Number = string.Join(",", t.Select(t => t.Number.ToString())),
UserName = c.Key,
Name = string.Join(",", t.Select(t => t.Name))
});


但是升级ef core3.1之后呢,这条查询语句报错了,说是“未将对象引用到实例”。错误的地方出现在
t.Select(t => t.Id)中,后来我查了些资料,对这条linq语句进行了修改,即在GroupBy之前加上AsEnumerable<B>()
最后变成这样:
var query = (from a in _aRepository.GetAll()
.Where(t => t.TenantID.ToString() == teantID)
join b in _bRepository.GetAll()
on a.bID equals b.Id
select new B
{
Id = b.Id,
ParentID = b.ParentID,
Number = b.Number,
Name = b.Name,
UserName = a.StaffName
}).AsEnumerable<B>().GroupBy(t => t.UserName).Select(t => new BDto() //AsEnumerable<B>()为新增
{
Id = string.Join(",", t.Select(t => t.Id)),
ParentID = string.Join(",", t.Select(t => t.ParentID.ToString())),
Number = string.Join(",", t.Select(t => t.Number.ToString())),
UserName = c.Key,
Name = string.Join(",", t.Select(t => t.Name))
});
这样的确是不报错了,但是我发现在toList之前,这条语句已经获取结果了,也就是说AsEnumerable已经访问了数据库了
。假如我要做分页查询,这种效率应该会比较低。因为它是把数据先从数据库加载了,然后再分页的,不是吗?
问题1,为什么升级ef core后会报错
问题2,怎么实现不报错,又保证之前的查询效率。
...全文
231 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
aierda 2020-03-24
  • 打赏
  • 举报
回复
引用 1 楼 Hello World, 的回复:
linq+lambda? 用一种语法来写呢
linq中基本都不少了lambda啊,跟这个有关系吗? 升级前都是好好的,没有任何问题,为什么升级这后反而不行了呢?
Hello World, 2020-03-18
  • 打赏
  • 举报
回复
linq+lambda?
用一种语法来写呢
360等软件会报安全未知软件,请允许执行。 v1.1.2014.10更新 1、增加了表表之间的关系,通过外键关系的实体类访问更方便 2、增加了DAL的Insert函数。其它基本操作在后续版本中实现. 3、增加了部分表、字段的中文注释功能等; 4、修正了一部分错误; 5、增加一个简单的示例; 软件件适用: 1、根据SQL数据库生成实体文件类,类似于SqlMetal和动软代码生成器,但是相比较SqlMetal简化了较多的不常用的函数(我认为的),成员变量支持数据库字段注释,一个表对应一个文件,不像sqlmetal如果数据库表和字段多了,一下生成几千行一个文件。 2、数据库操作采用的LINQ TO SQL,小规模的应当问题不大吧,实现了INSERT,UPDATE,EXIST,GET方法。DELETE比较简单,自己写吧,写在LINQ里面,我觉得不划算。 3、相比较动软代码生成器,生成代码除系统组件(System命名空间)外,不调用任何第三方组件。 4、可以做B\S的,也可以做C\S的,生成的示例以B\S。 5、纯绿色软件,无需要安装,而且只有一个文件! 运行环境: 1、64位操作系统,32位的没有测试过。需要.net fromwork4.0支持,当然还要一个数据库才能生成。 2、数据库SQL2008Express版本以上,高于此版本应当当没有问题。低于此版本,我只能呵呵的,说不定可以…… 3、数据库配置方式引用了Discuz!NT的做法,没有写在Web.Config文件里面。稍作修改你可以完全写出其它类似的配置文件。可惜,Discuz!NT现在不做了!在此深表怀念! 4、建议每个表都要定义主键或唯一键,建立索引否则生成的LINQ语句将无法完成查询。 v1.1.2014.10程序校验码: MD5 :3F7BE759F0BE7E86236620D57D4472FE SHA1 :69BABBBA33D516FA1AD0068F44C145989103FB4B CRC32 :EAD371EA 如果需要交流,加群:点软件上面的QQ直接加哦! 本软件适用开发小软件吧,大软件不知道性能怎么样,欢迎高手指点

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧