C# 如何执行linq查询以查找数据集中存在于集合的每个记录中的字段?

C# 如何执行linq查询以查找数据集中存在于集合的每个记录中的字段?,c#,linq,linq-to-xml,set-intersection,C#,Linq,Linq To Xml,Set Intersection,我有一个包含10K条记录的XML数据集,每个记录包含一组字段 我想知道在与数据集匹配的数据库模式中,哪些字段需要为null,哪些字段可以为非null linq是否提供了生成大型交叉口的方法 例如: <set> <item> <a/> <foo /> <b/> <c/> </item> <item> <a/> <foo /> <b/&

我有一个包含10K条记录的XML数据集,每个记录包含一组字段

我想知道在与数据集匹配的数据库模式中,哪些字段需要为null,哪些字段可以为非null

linq是否提供了生成大型交叉口的方法

例如:

<set>
 <item>
  <a/>
  <foo />
  <b/>
  <c/>
 </item>
 <item>
   <a/>
   <foo />
   <b/>
   <c/>
  </item>
 <item>
   <a/>
   <b/>
 </item>
 <item>
   <a/>
   <foo />
   <b/>
  </item>
</set>
预期结果:

{ "a", "b" }

您可以使用GroupBy并将组大小与元素总数进行比较:

XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item><item><a/><b/></item><item><a/><foo /><b/></item></set>");
var items = doc.Document.Element("set").Elements("item");
var commonElementNames = items.SelectMany(x => x.Elements()) // Get all immediate children
                              .GroupBy(x => x.Name) // Group by name
                              .Where(g => g.Count() == items.Count()) // Filter for only those which show in every group.
                              .Select(g => g.Key.LocalName) // Select just the element names
                              ;
XDocument doc=XDocument.Parse(“”);
var项目=单据单据要素(“集合”)。要素(“项目”);
var commonElementNames=items.SelectMany(x=>x.Elements())//获取所有直接子级
.GroupBy(x=>x.Name)//按名称分组
.Where(g=>g.Count()==items.Count())//仅筛选每个组中显示的项目。
.Select(g=>g.Key.LocalName)//只选择元素名称
;

在下面的代码中,selectedValue是非空列

XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item></set>");
var items = 
          doc.Descendants("item")
          .Select(x=>x.Descendants().Select(y=>y.Name).ToList()).ToList();
 var selectValue = items[0];
 foreach (var item in items)
 {
    selectValue = selectValue.Intersect(item).ToList();
 }
XDocument doc=XDocument.Parse(“”);
可变项目=
文件副本(“项目”)
.Select(x=>x.subjects().Select(y=>y.Name).ToList()).ToList();
var-selectValue=items[0];
foreach(项目中的var项目)
{
selectValue=selectValue.Intersect(item.ToList();
}

但是,如果在一个节点下有多个子元素(例如,“”在“”中出现两次),则这不起作用。
XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item></set>");
var items = 
          doc.Descendants("item")
          .Select(x=>x.Descendants().Select(y=>y.Name).ToList()).ToList();
 var selectValue = items[0];
 foreach (var item in items)
 {
    selectValue = selectValue.Intersect(item).ToList();
 }