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()的主要内容,如果未能解决你的问题,请参考以下文章