C# IEnumerable.GroupJoin和实体框架对象
(关于这一点的背景知识,请参见问题。) 我需要将C# IEnumerable.GroupJoin和实体框架对象,c#,algorithm,linq,entity-framework,ienumerable,C#,Algorithm,Linq,Entity Framework,Ienumerable,(关于这一点的背景知识,请参见问题。) 我需要将列表实体记录集合中的项目与列表对象集合相匹配(实体对象集合为引文类型,另一个为sRecord类型)。第二个集合和第一个集合之间存在1对1的排序关系,其中第二个集合中的每个对象都与第一个集合中的一条记录完全匹配(但不一定相反)。它们在引文类中名为ID的单个字段和sRecord类中名为ID的单个字段上匹配。试图运行嵌套循环来匹配它们很快就陷入了困境,因此我找到了一种方法,将整个集合匹配一次,然后遍历匹配的集合 下面是我如何组合建议的group join
列表
实体记录集合中的项目与列表
对象集合相匹配(实体对象集合为引文类型,另一个为sRecord类型)。第二个集合和第一个集合之间存在1对1的排序关系,其中第二个集合中的每个对象都与第一个集合中的一条记录完全匹配(但不一定相反)。它们在引文类中名为ID的单个字段和sRecord类中名为ID的单个字段上匹配。试图运行嵌套循环来匹配它们很快就陷入了困境,因此我找到了一种方法,将整个集合匹配一次,然后遍历匹配的集合
下面是我如何组合建议的group join语句的:
var draftMatches = draftRecords.GroupJoin(sRecords,
Citation => Citation.ID,
stiRecord => sRecord.id,
(Citations, sRecords) =>
new
{
Citation = Citations,
sRecord = sRecords.Select(sRecord => sRecord)
});
我不太相信我做对了
对于生成的匹配集,我需要将sRecord对象中的字段与引文对象中的字段进行比较,以确定引文对象是否需要更新。因为我使用的是Entity,所以我假设在使用单独的方法(为了代码重用目的而分开)更新引用对象时,需要保留对引用对象的引用,所以我尝试这样做:
DateTime recordDate = RecordUtilities.ConvertToDate(match.sRecord.FirstOrDefault().modifiedDate);
int comparison = recordDate.CompareTo((DateTime)match.Citation.modifiedDate);
if (comparison > 0)
{
EntityUtilities.MapToCitation(ref match.Citation, match.sRecord.FirstOrDefault());
updatedDraft++;
}
此时,我在match.Competition调用中得到一个IntelliSense错误,声明“属性、索引器或动态成员访问不能作为out或ref参数传递。”
我需要确保在执行context.Save()时保存的引文对象在适当的情况下从sRecord对象更新。我还需要确保我在匹配之前的代码时节省了时间。为了实现这些目标,我需要对代码进行哪些更改
var draftRecordDic = draftRecords.ToDictionary(record => record.ID);
var sRecordsDic = sRecords.ToDictionary(record => record.ID);
var validKeys = sRecordsDic.Keys.Intersect(draftRecordDic.Keys);
foreach(var key in validKeys)
{
var recOriginal = draftRecordDic[key];
var recMo = sRecordsDic[key];
// do your code here.
}
这应该可以很好地工作&很容易理解 我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”;我不知道我做了那件事。