Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ对其他实体中未出现的项目进行计数_C#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

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;
        });