EF如何避免.select中的相同数据
Posted
技术标签:
【中文标题】EF如何避免.select中的相同数据【英文标题】:EF how to avoid same data in .select 【发布时间】:2021-04-22 10:10:06 【问题描述】:我正在使用实体框架。我正在使用带有.Where
和.Select
条件的查询检索数据。
var myData = await _dbContext.Samples.Include(i => i.Experiment)
.Include(i => i.Experiment.Test)
.Include(i => i.Experiment.Test.Project)
.Include(i => i.Samples)
.Where(i => i.Experiment.Test.Status == 3 && i.Experiment.Test.TestId == 3)
.Select( e => new ExperimentCollections()
ExperimentNumber = e.Experiment.Test.ExperimentNumber,
ExperimentName = e.Experiment.Test.Project.Name
).ToListAsync();
可以有多行具有相同的ExperimentNumber
,我需要避免它插入myData
。
例如:在myData
:
myData[0]
ExperimentNumber: 1520,
ExperimentName: ABC
myData[1]
ExperimentNumber: 1521,
ExperimentName: EFG
myData[2]
ExperimentNumber: 1520,
ExperimentName: HIJ
我需要避免 myData[2]
数据在单个查询中使用实体框架插入到 myData
中,而不使用 foreach 循环。
我尝试使用 .Distinct() 执行以下代码
var myData = await _dbContext.Samples.Include(i => i.Experiment)
.Include(i => i.Experiment.Test)
.Include(i => i.Experiment.Test.Project)
.Include(i => i.Samples)
.Where(i => i.Experiment.Test.Status == 3 && i.Experiment.Test.TestId == 3)
.Select( e => new ExperimentCollections()
ExperimentNumber = e.Experiment.Test.ExperimentNumber,
ExperimentName = e.Experiment.Test.Project.Name
).Distinct().ToListAsync();
我什至也尝试过 .Distinct().OrderBy(i => i.TestNumber)。
【问题讨论】:
您尝试排除的只是实验 #1520 还是有其他标准?请发布minimal reproducible example。 @jwdonahue 我排除了相同的 ExperimentNumber 数据。如果出现相同的 ExperimentNumber 数据,则应将其排除。 哦,我想我现在看到了。您想避免重复数据吗? 这能回答你的问题吗? How can I do SELECT UNIQUE with LINQ? @jwdonahue 是的,我需要避免使用相同 ExperimentNumber 的数据 【参考方案1】:GROUP BY
语句通常与聚合函数 (COUNT, MAX, MIN, SUM, AVG
) 一起使用,以按一列或多列对结果集进行分组。
在Where子句之后使用GROUP BY column_name(s)
。
【讨论】:
【参考方案2】:您可以尝试使用Extend方法来避免列表中的相同数据。
public static class Extend
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
if (seenKeys.Add(keySelector(element)))
yield return element;
你可以像下面的代码一样使用它:
var query = data.DistinctBy(p => p.ExperimentNumber).ToList();
foreach (var item in query)
Console.WriteLine(item.ExperimentName+" "+item.ExperimentNumber);
结果:
【讨论】:
以上是关于EF如何避免.select中的相同数据的主要内容,如果未能解决你的问题,请参考以下文章
如何避免在EF自动生成的model中的DataAnnotation被覆盖掉