LinQ 连表查询 取 Count()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinQ 连表查询 取 Count()相关的知识,希望对你有一定的参考价值。

比如有两张:表AID int PK,varchar(40) name 表BID int Pk,a_ID int null,varchar(50) name 因为表B的a_ID是表A的但是,可以为空,和为0,所以不能给他外键。但是当我要做count的时候遇到问题了。ent.A.Count()。如果我要把这两个表连起来查,获得Count及不行了。应该怎么写啊。多表无外键连接查询

参考技术A linq to sql 实现左外部连接:
var query=form a0 in A
join b0 in B
on a0.ID equals b0.a_ID into ab
from a1 in ab.DefaultIfEmpty()
select a1;追问

谢谢你的回答。你这是实现了外部链接。但是你这个等于直接把数据从数据库提取出来了啊。这样的效率之类的,会慢,而却内存也耗的多。我希望的是直接通过count来实现统计条数,而且能实现表的自由连接。这个可以吗?

追答

这个简单啊,linq是延迟查询的,定义这个语句不会全取出来,要查询条数直接query.Count()就行了啊,一条数据不会读取。

不过你仅仅是为了查询条数就没必要实现表连接了,直接查询A的条数就行了。要想实现自由连接,就使用into语句,就能生成left outer join语句了。即使B中的a_ID为空或为0都可以查出A表中的满足条件的记录。

Linq 计数错误(列)

【中文标题】Linq 计数错误(列)【英文标题】:Linq Error with Count(column) 【发布时间】:2015-04-27 14:07:27 【问题描述】:

我正在尝试将 SQL 查询写入 Linq,但在获取 Linq 查询中的计数时出现错误。 Sql 中的查询使用 distinct 和 count('coulmn') 离开了外连接。错误发生在 Select new

内的 count 关键字上

SQL 查询:

select MagDesc.MagDescID,  MagDesc.MagTitle, COUNT(*)
from   MagDesc (nolock) 
       left outer join tblDetails (nolock) 
            on MagDesc.MagDescID = tblDetails.MagDescID
where PropertyID is not null
group by MagDesc.MagDescID,  MagDesc.MagTitle

Linq 查询:

    var model = (from mag in _dbContext.MagDesc
                 join dt in _dbContext.tblDetails on mag.MagDescID equals dt.MagDescID into dt
                 where mag.PropertyID != null
                 from subtable in dt.DefaultIfEmpty()
                 select new  mag.MagDescID, mag.MagTitle, dt.Count(m=>m.MagDescID) ).Distinct();

错误消息:“无效的匿名类型成员声明器。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。”

请在这个 linq 查询中帮助我。

更新:添加收到的错误消息

【问题讨论】:

看看编译错误是什么。然后看the documentation。 只需将名称命名为您的对象属性select new Id = mag.MagDescID, Title = mag.MagTitle, Count = dt.Count(m=>m.MagDescID) ) 尝试更改变量名-"在 _dbContext.tblDetails 中将 dt 加入 mag.MagDescID 等于 dt.MagDescID 到 dtxx" 是的,我做到了。仍然是同样的错误。也重新编译了。 【参考方案1】:
   dt.Count(m=>m.MagDescID)

.Count 的那个版本采用一个应该返回布尔值的函数。 我猜 MagDescID 不是布尔值...

也许您的意思是计算 ID 的数量:

   dt.Select(m => m.MagDescID)
     .Count()

您还需要为属性命名(如另一个答案中所述):

  select new 
   
      mag.MagDescID, 
      mag.MagTitle, 
      magCount = dt.Select(m => m.MagDescID).Count()
   

【讨论】:

是的,我正在尝试获取 id 的计数。但我没有在 dt.Select(m => m.MagDescID) 附近得到 .Distinct()。选择新的 mag.MagDescID, mag.MagTitle, dt.Count(m=>m.MagDescID)).Distinct().Count();

以上是关于LinQ 连表查询 取 Count()的主要内容,如果未能解决你的问题,请参考以下文章

Linq to SQL 的连表查询(转)

python 数据库连表查询习题

EF的连表查询Lambda表达式和linq语句(转)

全国排名的问题(linq 的连表查询 等同于sql的left join)

MySQL分组与连表查询

用Entity Framework 连表查询