我有一个实体框架查询,它在表之间进行一些联接,以提供一些数据,然后将其映射到对象列表。列表中的对象具有如下结构:
public ListObject
{
public Panel Panel
public Code Code
}
Panel 和 Code 只有简单的属性,如名称、Id 等
我正在循环对象列表并在将它们添加到数据集中之前进行一些处理。该代码如下所示:
foreach (var l in listObject)
{
var codeString = string.Empty;
if (l.Code != null)
{
listObject.Where(x => string.Equals(x.Code.Id, l.Panel.Id))
.DistinctBy(x => x.Code.Name)
.ForEach(x => codeString += $"{x.Code.Name},")
}
...add to DataSet
}
这个想法是,如果我有类似的数据
面板:
Id
1
1
1
2
代码如下:
Id | Name
1 | hi
1 | hi
1 | hello
3 | bye
当添加到我的数据集时,对于每个插入的行,我都有完整的逗号分隔的不同名称的字符串。所以 Id 1 的行看起来像
Id | Names
1 | hi, hello
1 | hi, hello
1 | hi, hello
3 | bye
大多数时候,Code 对象为 null,并且在此列表上的处理速度非常快。在极少数情况下,我有 100,000 个面板和 100,000 个代码,这需要很长时间来处理,所以我正在研究如何优化它。
我已经考虑分解我的查询,以便我只有一个面板列表,然后我的代码进入字典并可以在那里进行更快的处理,但每次将其拆分为两个数据库查询似乎也不理想。有没有更好的方法来获取与面板关联的代码的不同名称?
您可以尝试在 listObject
上使用
Linq for objects,例如
var dict = listObject
.Where(x => x.Code != null)
.GroupBy(x => x.Code.Id,
x => x.Code.Name)
.ToDictionary(group => group.Key,
group => string.Join(", ", group.Distinct()));
在这里,我将结果具体化为 dictionary,
Key
id Code.Id
和 Value
是逗号分隔的不同 Code.Name
s:
{ 1, "hi, hello" }
{ 3, "bye" }
然后你可以循环并添加到DataSet:
foreach (var l in listObject) {
if (l.Code != null) {
var id = l.Code.Id;
var name = dict[l.Code.Id];
... Add to DataSet
}
}