LINQ计算其他实体中没有出现的项目

时间:2014-07-31 05:53:36

标签: c# linq entity-framework linq-to-entities

假设我们有一个实体和一个 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个没有关联报告” 任何帮助表示赞赏。

4 个答案:

答案 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();

这会将计数作为包含属性totalDomainsdomainsWithNoReports的匿名类型返回。

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