我正在尝试获取另一个表中的行数。我需要带有品牌行为的tbl_result_subject_brand表的结果计数。我对此情况有疑问:
pid()
此查询工作正常,但是如何在ASP.NET中将该查询转换为LINQ表达式?真的我不知道该怎么做。
SELECT tbl_brand.OID, (SELECT COUNT(*) FROM tbl_result_subject_brand WHERE tbl_result_subject_brand.brand_id = tbl_brand.OID) AS NewsCount FROM tbl_brand
答案 0 :(得分:1)
我猜是这样的。
class Test
{
public void TestMethod()
{
var repo = new Repository();
var result = repo.tbl_brand
.Select(b => new NetNewsCounts()
{
BrandID = b.OID,
ResultCount = repo.tbl_result_subject_brand.Count(rb => rb.brand_id == b.OID)
}).ToList();
}
private class Brand
{
public string OID { get; set; }
}
private class ResultBrand
{
public string brand_id { get; set; }
}
private class Repository
{
public List<Brand> tbl_brand { get; set; }
public List<ResultBrand> tbl_result_subject_brand { get; set; }
}
private class NetNewsCounts
{
public string BrandID { get; set; }
public int ResultCount { get; set; }
}
}
答案 1 :(得分:0)
如果执行普通联接,则只会获得两个表上的id的结果。如果这确实是您想要的,则可以简化它,只查询一个表:
var result = muleContext.tbl_result_subject
.GroupBy(i => i.BrandID)
.Select(i => new NetNewsCounts { BrandID = i.Key, ResultCount = g.Count() });
如果要使用tbl_brand
中的ID,但可能不需要tbl_result_subject
中的ID,请执行类似于以下操作的左联接:LINQ - Left Join, Group By, and Count。突出部分与上面的类似。
答案 2 :(得分:0)
您可以按查询将查询简化为一组:
SELECT OID, COUNT(*)
FROM tbl_result_subject_brand
Group By OID
可以将其翻译为linq:
(from r in muleContext.tbl_result_subject_brand
group r by r.OID into g
select new NetNewsCounts { BrandID = g.Key, ResultCount= g.Count() }).ToList();
答案 3 :(得分:0)
这样写
public List<Result> GetCount()
{
using (MuleContext db = new MuleContext())
{
var list = db.tbl_brand.Tolist();
List<Result> GN = new List<Result>();
foreach (var n in list)
{
Result Notif = new Result()
{
OID = n.OID,
ResultCount=db.tbl_result_subject_brand.where(t=>t.brand_id=n.OID)
};
GN.Add(Notif);
}
return GN;
}
}
答案 4 :(得分:0)
有两种解决方法,但最简单的方法是最直接的方法。我假设您的实际查询要求是您获得所有OID
值,该值的计数(包括0)在另一个表中匹配行。
这是您的源查询(经过重新格式化,并带有一些别名以使其更简单):
SELECT
b.OID,
(
SELECT COUNT(*)
FROM tbl_result_subject_brand rs
WHERE rs.brand_id = b.OID
) AS NewsCount
FROM tbl_brand b
我们至少可以在某些LINQ ORM中做几乎完全相同的事情:
using (var ctx = new MuleContext())
{
var query =
from b in ctx.tbl_brand
select new
{
b.OID,
NewsCount = ctx.tbl_result_subject_brand.Count(rs => rs.brand_id == b.OID)
};
var list = query.ToList();
}
当使用Linq2DB时,这对我有用,它将Linq2DB转换为与原始查询基本相同的SQL查询。完全相同的结构。使用上述格式,其他ORM可能不太正常。
另一个选项是组和联接。请注意,默认情况下,联接是 inner 。您需要使用join...into...DefaultIfEmpty
来获得等效的left outer join
,然后处理缺失的值。这是一个痛苦的过程。
这有两种形式:group-then-join或join-then-group。第一个使用子查询获取计数,然后加入该查询以获取所需的值:
var rsCounts =
from rs in ctx.tbl_result_subject_brand
group 0 by rs.brand_id into grp
select new { brand_id = grp.Key, NewsCount = (int?)grp.Count() };
var query =
from b in ctx.tbl_brand
join rs in rsCounts on b.OID equals rs.brand_id into rstmp
from rs in rstmp.DefaultIfEmpty()
select new
{
b.OID,
NewsCount = rs.NewsCount ?? 0
};
(您可以在一个语句中完成它。有时候很难弄清楚它在做什么。)
另一个版本将表连接在一起,然后在相关列上分组。这使用Sum
而不是Count
检查丢失的行:
var query =
from b in ctx.tbl_brand
join rs in ctx.tbl_result_subject_brand on b.OID equals rs.brand_id into rstmp
from rs in rstmp.DefaultIfEmpty()
group (rs.brand_id == null ? 0 : 1) by b.OID into grp
select new
{
OID = grp.Key,
NewsCount = grp.Sum()
};
不漂亮,但是可以。
我建议您看看运行以上命令时SQL的外观。有时,SQL有点奇怪。