C# LINQ对其他实体中未出现的项目进行计数
假设我们有一个域实体和一个报告实体,其中为所选域生成报告C# LINQ对其他实体中未出现的项目进行计数,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,假设我们有一个域实体和一个报告实体,其中为所选域生成报告 Class Domain { [key] int Id {get; set} string Domain {get; set} } Class Report { [key] int Id {get; set} datetime Created {get; set} int DomainId {get; set} //etc. } 我需要编写一个LINQ to Entities查询,返回2个int值:没有报告的域的数量和报告
Class Domain
{
[key]
int Id {get; set}
string Domain {get; set}
}
Class Report
{
[key]
int Id {get; set}
datetime Created {get; set}
int DomainId {get; set}
//etc.
}
我需要编写一个LINQ to Entities查询,返回2个int值:没有报告的域的数量和报告的总数,如“209个域中有3个没有相关的报告”。
感谢您的帮助。在此处输入代码公共类域
enter code herepublic class Domain
{
public int Id {get; set; }
public string Dom {get; set;}
}
public class Report
{
public int Id {get; set;}
public DateTime Created {get; set;}
public int DomainId { get; set; }
}
List<Domain> objDomain = new List<Domain>();
List<Report> objReport = new List<Report>();
Domain objD1 = new Domain();
Report objR1 = new Report();
objD1.Id = 1;
objD1.Dom = "google.com";
objR1.Id = 1;
objR1.DomainId = 1;
objDomain.Add(objD1);
objReport.Add(objR1);
Domain objD2 = new Domain();
Report objR2 = new Report();
objD2.Id = 2;
objD2.Dom = "yahoo.com";
objR2.Id = 2;
objR2.DomainId = 1;
objDomain.Add(objD2);
objReport.Add(objR2);
int count = objDomain.Count(Domaindata => objReport.Any(ReportData => ReportData.DomainId != Domaindata.Id));
{
公共int Id{get;set;}
公共字符串Dom{get;set;}
}
公开课报告
{
公共int Id{get;set;}
已创建公共日期时间{get;set;}
公共int域ID{get;set;}
}
List objDomain=新列表();
List objReport=新列表();
Domain objD1=新域();
报告objR1=新报告();
objD1.Id=1;
objD1.Dom=“google.com”;
objR1.Id=1;
objR1.DomainId=1;
objDomain.Add(objD1);
objReport.Add(objR1);
Domain objD2=新域();
报告objR2=新报告();
objD2.Id=2;
objD2.Dom=“yahoo.com”;
objR2.Id=2;
objR2.DomainId=1;
objDomain.Add(objD2);
objReport.Add(objR2);
int count=objDomain.count(Domaindata=>objReport.Any(ReportData=>ReportData.DomainId!=Domaindata.Id));
输出为=1
有关更多详细信息,请使用Except()检查我的保存小提琴中的代码
即。
var firstMinusSecond=first.Except(second)
您的域
实体似乎可以与报表
实体建立一对多关系,如下所示:
public class Domain
{
[Key]
public int Id { get; set; }
public ICollection<Report> Reports { get; set; }
public Domain()
{
Reports = new List<Report>();
}
}
然后以单个查询的形式获取总计数和无报告计数:
var report = (from domains in context.Domains
let totalDomains = context.Domains.Count()
let domainsWithNoReports = context.Domains.Count(x => !x.Reports.Any())
select new {totalDomains, domainsWithNoReports}).FirstOrDefault();
这将以匿名类型返回计数,属性为
totalDomains
和domainsWithNoReports
我可能有一个解决方案,但我在列表上进行了测试,不知道它是否适用于linq to实体。查询返回2个整数的元组。第一个是总报告数,第二个是没有报告的域数
var test = domains.Aggregate(new Tuple<int, int>(0, 0), (partial, next) =>
{
var domainReports = reports.Count(p => p.DomainId == next.Id);
var ret = new Tuple<int, int>(partial.Item1 + domainReports, domainReports > 0 ? partial.Item2 + 1 : partial.Item2);
return ret;
});
var test=domains.Aggregate(新元组(0,0),(部分,下一个)=>
{
var domainReports=reports.Count(p=>p.DomainId==next.Id);
var ret=新元组(partial.Item1+domainReports,domainReports>0?partial.Item2+1:partial.Item2);
返回ret;
});
是否需要为1个查询?如果没有,您可以对所有域进行计数,然后对第二个表进行另一次计数(在DomainId上不同)。如果不只是做你通常的外部连接。理想情况下,一个查询,两个值将作为JSON数组返回。我认为它应该以一个带有匿名类型的select
子句结束,类似于select new{DomainsWithNoReports=,totalDomains=}
@CarstenKönig是的,有一个除了
SQL操作符。真的吗?哇-令人印象深刻-它可以处理所有类型的投影?在服务器端。。。我想我必须调查一下这件事——谢谢你们之间的关系,所以是的,我要试试你们的解决方案。我不知道let
子句。谢谢你,朗博阿瑞。
var test = domains.Aggregate(new Tuple<int, int>(0, 0), (partial, next) =>
{
var domainReports = reports.Count(p => p.DomainId == next.Id);
var ret = new Tuple<int, int>(partial.Item1 + domainReports, domainReports > 0 ? partial.Item2 + 1 : partial.Item2);
return ret;
});