【问题标题】:Convert Sql Statement to Entity Framework Core [closed]将 Sql 语句转换为 Entity Framework Core [关闭]
【发布时间】:2021-05-08 22:22:08
【问题描述】:

如何在实体框架核心中将此 sql 查询转换为 linq?

Select a.Id,a.Url,c.Title,a.ParentId,b.totalSubCats 
From [Tbl_Menu] As a 
LEFT OUTER JOIN
  ( Select ParentId, Count(*) As totalSubCats From [Tbl_Menu] Group By ParentId ) As b
On a.Id=b.ParentId
LEFT OUTER JOIN [Tbl_Menu] As c On a.Id = c.Id
ORDER BY a.Id

我们在Menu_Tbl 中有这些专栏

IdUrlTitleDescriptionParentId

对于Left Join,我写了这个查询但无法运行

 var query = (from m1 in _context.Menu_Tbl 
                     join m2 in _context.Menu_Tbl on m1.Id equals m2.Id 
                     into m3 from m in m3.DefaultIfEmpty() select m1);

【问题讨论】:

  • 你读过How to Ask吗?展示你的尝试,Stack Overflow 不是代码翻译服务。
  • 显示您尝试过的内容。对赞成者:我希望他们剥夺你的投票权。
  • 我绝对是来帮忙的,请尝试查看我的个人资料。同样,您需要阅读How to Ask。我们对提问者有某些期望,而您却没有表现出来。如果您的代码“无法运行”,请解释发生了什么。它不编译,它会抛出运行时异常吗?当您研究这些错误时,您发现了什么?
  • @CodeCaster 必要的一切都已完成。我有一个需要重写为实体的 sql 查询。我已经在我的问题中包含了我在项目中所做的事情。
  • SQL 查询无法转换为 LINQ。充其量您可以编写一个翻译成类似 SQL 的 LINQ 语句。这需要了解类模型和映射,因为应该使用导航属性而不是 LINQ 的 join 语句。这就是为什么这个问题缺乏背景信息。

标签: c# sql entity-framework linq


【解决方案1】:

这个应该可以的。只需将大查询除以小块(子查询)

var grouped = 
   from m in ctx.Tbl_Menu
   group m by new { m.ParentId } into g
   select new 
   {
       g.Key.ParentId,
       totalSubCats = g.Count()
   };

var query = 
   from a in ctx.Tbl_Menu 
   join b in grouped on a.Id equals b.ParentId into gj
   from b in gj.DefaultIfEmpty()
   join c in ctx.Tbl_Menu on a.Id equals c.Id into ggj
   from c in ggj.DefaultIfEmpty()
   select new 
   {
       a.Id,
       a.Url,
       c.Title,
       a.ParentId,
       b.totalSubCats 
   };

【讨论】:

  • 不幸的是它不起作用并且有很多错误
  • 那么,您还没有发布模型并且想要一些没有错误的东西?固定分组。
  • 谢谢,效果很好。只是我将gj 更改为ggj,因为它被重复了。
  • 从内存中写入,所以可能会出错。更正答案。
【解决方案2】:

我认为将查询设为存储过程然后使用 yourReturnedDbSet objectReceived = context.yourReturnedDbSet.FromSqlRaw("EXECUTE StoredProcedureName @exampleParam") 调用存储过程会更容易。但至于转换它,如果你有正确的对象,你几乎可以使用相同的语法。您还需要一个包含要返回的类型的列表。

【讨论】:

  • 我使用的是Entity Framework Core,存储过程没有很好的例程支持
  • 我不确定你的意思,我正在使用带有 EFCore 的存储过程,这很好。有时您只需要创建一个新的 DbSet。
  • 坏主意。查询很简单,创建 SP 就大材小用了。
  • 相反,我认为存储过程也很容易制作。
  • 我认为dataset 会在您的服务器上产生额外的负载。特别是对于具有大量用户的系统。将为每个用户创建一个dataset。对于许多用户来说,这意味着初始许多 dataset
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2012-05-22
  • 2021-11-08
  • 1970-01-01
  • 2023-03-16
  • 2023-01-27
相关资源
最近更新 更多