假设我们有一个域实体和一个 Reports 实体,其中为所选域生成报告。
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.
}
我需要编写一个返回2个int值的LINQ-to-Entities查询:没有报告的域数量,以及报告的总数,如“209个域中的3个没有关联报告” 任何帮助表示赞赏。
答案 0 :(得分:0)
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));
输出= 1
有关详细信息,请查看我的保存小提琴https://dotnetfiddle.net/ZhEj8Z
中的代码答案 1 :(得分:0)
除了(http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx)
即。
var firstMinusSecond = first.Except(second);
答案 2 :(得分:0)
您的Domain
实体看起来可以与Report
实体建立一对多关系,如下所示:
public class Domain
{
[Key]
public int Id { get; set; }
public ICollection<Report> Reports { get; set; }
public Domain()
{
Reports = new List<Report>();
}
}
要获取没有报告的域数,您可以执行以下操作:
var countOfDomainsWithNoReports =
context.Domains.Count(x => !x.Reports.Any());
然后获取总计数和计数而没有报告作为单个查询:
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
的匿名类型返回。
答案 3 :(得分:0)
我可能有一个解决方案,但我在列表上测试过,我不知道它是否适用于实体的linq。查询返回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;
});