Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# 如何在c中使用带条件的selectmany#_C#_Json_Linq_Lambda - Fatal编程技术网

C# 如何在c中使用带条件的selectmany#

C# 如何在c中使用带条件的selectmany#,c#,json,linq,lambda,C#,Json,Linq,Lambda,我有搜索库的文件,文件的详细信息存储在CosmosDB在下面的结构 {​ "id": "e7f56bbc-3387-4034-9eab-03cdaaa7bead",​ "fileName": "reviewforq1",​ "parentId": "",​ "year": 2019,​ "quarter": "q1",​ "path": "<>",​ "content": [​ {​ "version": 1,​ "stat

我有搜索库的文件,文件的详细信息存储在CosmosDB在下面的结构

{​
  "id": "e7f56bbc-3387-4034-9eab-03cdaaa7bead",​
  "fileName": "reviewforq1",​
  "parentId": "",​
  "year": 2019,​
  "quarter": "q1",​
  "path": "<>",​
  "content": [​
    {​
      "version": 1,​
      "state": "submitted",​
      "createdBy": "person1",​
      "createdOn": "10/04/2019 15:16:00",​
      "data": [​
        {​
          "field": "scheme",​
          "value": "abc",​
          "isColorEnabled": "false",​
          "color": "",​
          "isFlagEnabled": "false",​
          "flags": [],​
          "isCommentsEnabled": "false",​
          "comments": ""​
        },​
        {​
          "field": "projectNumber",​
          "value": "abc123",​
          "isColorEnabled": "false",​
          "color": "",​
          "isFlagEnabled": "false",​
          "flags": [],​
          "isCommentsEnabled": "false",​
          "comments": ""​
        }
    }
}
{​
“id”:“e7f56bbc-3387-4034-9eab-03CDAAA7B”,​
“文件名”:“reviewforq1”,​
“parentId”:“,​
“年份”:2019年,​
“季度”:“q1”,​
“路径”:“,​
“内容”:[​
{​
“版本”:1,​
“国家”:“已提交”,​
“createdBy”:“person1”,​
“createdOn”:“2019年4月10日15:16:00”,​
“数据”:[​
{​
“字段”:“方案”,​
“价值”:“abc”,​
“isColorEnabled”:“false”,​
“颜色”:“,​
“isflagnabled”:“false”,​
“旗帜”:[],​
“isCommentsEnabled”:“false”,​
“评论”:”​
},​
{​
“字段”:“项目编号”,​
“值”:“abc123”,​
“isColorEnabled”:“false”,​
“颜色”:“,​
“isflagnabled”:“false”,​
“旗帜”:[],​
“isCommentsEnabled”:“false”,​
“评论”:”​
}
}
}
我在图书馆使用下面的模型

public class Files
{
    [JsonProperty(PropertyName = "id")]
    public Guid Id { get; set; }
    [JsonProperty(PropertyName = "fileName")]
    public string FileName { get; set; }
    [JsonProperty(PropertyName = "parentId")]
    public Guid ParentId { get; set; }
    [JsonProperty(PropertyName = "year")]
    public int Year { get; set; }
    [JsonProperty(PropertyName = "quarter")]
    public string Quarter { get; set; }
    [JsonProperty(PropertyName = "path")]
    public string Path { get; set; }
    [JsonProperty(PropertyName = "content")]
    public List<Content> Content { get; set; }
}
public class FileVersionDetails
{
    public Guid Id { get; set; }
    public string Path { get; set; }
    public string Quarter { get; set; }
    public int Year { get; set; }
    public string FileName { get; set; }
    public List<Data> Data { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
    public int Version { get; set; }
}
公共类文件
{
[JsonProperty(PropertyName=“id”)]
公共Guid Id{get;set;}
[JsonProperty(PropertyName=“fileName”)]
公共字符串文件名{get;set;}
[JsonProperty(PropertyName=“parentId”)]
公共Guid ParentId{get;set;}
[JsonProperty(PropertyName=“year”)]
公共整数年{get;set;}
[JsonProperty(PropertyName=“quarter”)]
公共字符串四分之一{get;set;}
[JsonProperty(PropertyName=“path”)]
公共字符串路径{get;set;}
[JsonProperty(PropertyName=“content”)]
公共列表内容{get;set;}
}
公共类FileVersionDetails
{
公共Guid Id{get;set;}
公共字符串路径{get;set;}
公共字符串四分之一{get;set;}
公共整数年{get;set;}
公共字符串文件名{get;set;}
公共列表数据{get;set;}
通过{get;set;}创建的公共字符串
public DateTime CreatedOn{get;set;}
公共int版本{get;set;}
}
这是我搜索文件集合的方式,以获取文件的最新版本

List<FileVersionDetails> latestFileVersionDetails = new List<FileVersionDetails>();
var fileVersionDetails = files
.SelectMany(j => j.Content,
    (parent, child) => new FileVersionDetails
    {
        Id = parent.Id,
        Path = parent.Path,
        Quarter = parent.Quarter,
        Year = parent.Year,
        FileName = parent.FileName,
        Data = child.Data,
        CreatedBy = child.CreatedBy,
        CreatedOn = child.CreatedOn,
        Version = child.Version
    });

var fileIds = files.Select(i => i.Id);

foreach (var item in fileIds)
{
    var fileVersions = fileVersionDetails.Where(k => k.Id == item);
    int maxVersion = fileVersions.Max(l => l.Version);

    latestFileVersionDetails.Add(fileVersions.Where(o => o.Version == maxVersion).FirstOrDefault());
}
List latestFileVersionDetails=new List();
var fileVersionDetails=文件
.SelectMany(j=>j.Content,
(父级,子级)=>新文件版本详细信息
{
Id=parent.Id,
Path=parent.Path,
季度=家长。季度,
年=父母。年,
FileName=parent.FileName,
Data=child.Data,
CreatedBy=child.CreatedBy,
CreatedOn=child.CreatedOn,
Version=child.Version
});
var fileIds=files.Select(i=>i.Id);
foreach(fileid中的var项)
{
var fileVersions=fileVersionDetails.Where(k=>k.Id==item);
int maxVersion=fileVersions.Max(l=>l.Version);
latestFileVersionDetails.Add(fileVersions.Where(o=>o.Version==maxVersion.FirstOrDefault());
}
这是可行的,但我认为应该有一个有效的方法来完成这项工作,而不必使用foreach,请建议我是否使用了错误的方法或我可以做的任何改进


谢谢

您可以按
Id
fileVersionDetails
进行分组,并按
Version
对每组进行排序:

var fileVersionDetails = ...;

List<FileVersionDetails> latestFileVersionDetails = fileVersionDetails
    .GroupBy(x => x.Id)
    .Select(g => g.OrderByDescending(g => g.Version).First())
    .ToList();
var fileVersionDetails=。。。;
列出latestFileVersionDetails=fileVersionDetails
.GroupBy(x=>x.Id)
.Select(g=>g.OrderByDescending(g=>g.Version).First())
.ToList();
或:

列出最新的FileVersionDetails=文件
.SelectMany(…)
.GroupBy(x=>x.Id)
.Select(g=>g.OrderByDescending(g=>g.Version).FirstOrDefault())
.ToList();

您可以按
Id
fileVersionDetails
进行分组,并按
Version
对每组进行排序:

var fileVersionDetails = ...;

List<FileVersionDetails> latestFileVersionDetails = fileVersionDetails
    .GroupBy(x => x.Id)
    .Select(g => g.OrderByDescending(g => g.Version).First())
    .ToList();
var fileVersionDetails=。。。;
列出latestFileVersionDetails=fileVersionDetails
.GroupBy(x=>x.Id)
.Select(g=>g.OrderByDescending(g=>g.Version).First())
.ToList();
或:

列出最新的FileVersionDetails=文件
.SelectMany(…)
.GroupBy(x=>x.Id)
.Select(g=>g.OrderByDescending(g=>g.Version).FirstOrDefault())
.ToList();

您可以添加一个LINQ扩展方法
MaxBy
(或从MoreLinq获得),以查找每个文件
Id
的最大值:

public class IEnumerableExt {
    public static T MaxBy<T, TKey>(this IEnumerable<T> src, Func<T, TKey> keySelector) => src.Aggregate((a, b) => Comparer<TKey>.Default.Compare(keySelector(a), keySelector(b)) >= 0 ? a : b);
}
var latestFileVersionDetails = fileVersionDetails
                                    .GroupBy(f => f.Id)
                                    .Select(fg => fg.MaxBy(f => f.Version))
                                    .ToList();

您可以添加一个LINQ扩展名方法
MaxBy
(或从MoreLinq获得),以查找每个文件
Id
的最大值:

public class IEnumerableExt {
    public static T MaxBy<T, TKey>(this IEnumerable<T> src, Func<T, TKey> keySelector) => src.Aggregate((a, b) => Comparer<TKey>.Default.Compare(keySelector(a), keySelector(b)) >= 0 ? a : b);
}
var latestFileVersionDetails = fileVersionDetails
                                    .GroupBy(f => f.Id)
                                    .Select(fg => fg.MaxBy(f => f.Version))
                                    .ToList();