C# 如何在c中使用带条件的selectmany#
我有搜索库的文件,文件的详细信息存储在CosmosDB在下面的结构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
{
"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();