0

所以,假设我有一个Contest可以有多个ContestCulture. 对于本次比赛,我必须有Documents,其中有 aDocumentType和 a Culture(Rules, TermsAndConditions, PrivacyPolicy)

对于每个ContestCulture,我必须至少有一个才能使 有效。DocumentDocumentTypeContest

所以假设我有一个Contest2 ContestCulture(fr-CA, en-CA) 我必须至少有 6DocumentContest

  • 文档 1:文化 1、规则
  • 文档 2:文化 1、条款和条件
  • 文档 3:文化 1、隐私政策
  • 文档 4:文化 2、规则
  • 文档 5:文化 2、条款和条件
  • 文档 6:文化 2、隐私政策

实体如下:

public class Document
{
    public DocumentType DocumentType { get; set; }
    public int CultureId { get; set; }
    public Culture Culture { get; set; }
    public int ContestId { get; set; }
    public Contest Contest { get; set; }
    //Some other properties
    //...
}

public class Contest
{
    public List<Document> Documents { get; set; }
    public List<ContestCulture> ContestCultures { get; set; }
    //Some other properties
    //...

}

public class ContestCulture 
{
     public int ContestId { get; set; }
    public Contest Contest { get; set; }

    public int CultureId { get; set; }
    public Culture Culture { get; set; }

    //Some other properties
    //...
}

public class Culture
{
    public string Code { get; set; }
    public string Name { get; set; }
}

现在已经设置了上下文..

我有 3 个清单:

  • DocumentTypeenum值列表) 的列表
  • 一个ContestCultureID 列表(列表int
  • (列表)的Documents列表ContestDocument

我如何检查Document每个人是否至少有 1DocumentTypeContestCulture

我对 LinQ 真的很陌生,所以我尝试了这个:

from cultureId in list_usedCultureIdsForContest
join doc in documents on cultureId equals doc.CultureId into temp1
from t in temp1.DefaultIfEmpty()
select new {cultureId, t};

但它只给了我我拥有的那些,如下所示: 在此处输入图像描述

4

2 回答 2

1

首先,从以下位置获取每种文化所需的文档类型数量enum

var numDocumentTypes = Enum.GetNames(typeof(DocumentType)).Length;

然后,计算每个不同文档类型的数量CultureId

var docTypesPerCulture = documents.GroupBy(d => d.CultureId)
                                  .Select(dg => new {
                                        CultureId = dg.Key,
                                        Count = dg.Select(d => d.DocumentType).Distinct().Count()
                                   });

现在,您可以左连接到使用的文化 ID(以处理没有文档的文化 ID)并过滤到缺少文档类型的文化 ID:

var ans = list_usedCultureIdsForContest.GroupJoin(docTypesPerCulture,
                                                  ci => ci,
                                                  dpc => dpc.CultureId,
                                                  (ci, dpcj) => dpcj.Any() ? dpcj.Select(dpc => new { CultureId = ci, Count = dpc.Count }).Single()
                                                                           : new { CultureId = ci, Count = 0 }
                                        )
                                       .Where(cic => cic.Count != numDocumentTypes);
于 2020-03-06T19:27:17.057 回答
0

简单的 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication159
{
    class Program
    {

        static void Main(string[] args)
        {
            List<Document> contest = new List<Document>() {
                new Document() { contestCulture = 1,  documentType = DocumentType.Rules },
                new Document() { contestCulture = 1,  documentType = DocumentType.TermsAndConditions },
                new Document() { contestCulture = 1,  documentType = DocumentType.PrivacyPolicy },
                new Document() { contestCulture = 2,  documentType = DocumentType.Rules },
                new Document() { contestCulture = 2,  documentType = DocumentType.TermsAndConditions },
                new Document() { contestCulture = 2,  documentType = DocumentType.PrivacyPolicy  }
            };

            var valid = contest.GroupBy(x => x.contestCulture)
                .Select(x => new { culture = x.Key, valid = Valid(x.ToList()) })
                .ToList();


        }

        static bool Valid(List<Document> documents)
        {
            return documents.Any(x => x.documentType == DocumentType.Rules) &&
                documents.Any(x => x.documentType == DocumentType.TermsAndConditions) &&
                documents.Any(x => x.documentType == DocumentType.PrivacyPolicy);
        }
    }
    public enum DocumentType
    {
        Rules,
        TermsAndConditions,
        PrivacyPolicy
    }
    public class Document
    {
        public int contestCulture { get; set; }
        public DocumentType documentType { get; set; }
    }

}

还有另一种方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication159
{
    class Program
    {

        static void Main(string[] args)
        {
            List<Document> contest = new List<Document>() {
                new Document() { contestCulture = 1,  documentType = DocumentType.Rules },
                new Document() { contestCulture = 1,  documentType = DocumentType.TermsAndConditions },
                new Document() { contestCulture = 1,  documentType = DocumentType.PrivacyPolicy },
                new Document() { contestCulture = 2,  documentType = DocumentType.Rules },
                new Document() { contestCulture = 2,  documentType = DocumentType.TermsAndConditions },
                new Document() { contestCulture = 2,  documentType = DocumentType.PrivacyPolicy  }
            };

            var valid = contest.GroupBy(x => x.contestCulture)
                .Select(x => new { culture = x.Key, valid = Valid(x.ToList()) })
                .ToList();

        }

        static bool Valid(List<Document> documents)
        {
            int or = 0;
            foreach (Document document in documents)
            {
                or |= (int)document.documentType;
            }
            return (or == 7) ? true : false;
        }
    }
    public enum DocumentType
    {
        Rules = 1,
        TermsAndConditions = 2,
        PrivacyPolicy = 4
    }
    public class Document
    {
        public int contestCulture { get; set; }
        public DocumentType documentType { get; set; }
    }

}
于 2020-03-06T17:44:06.527 回答