【问题标题】:EF how to avoid same data in .selectEF如何避免.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 的数据

标签: c# database api entity-framework visual-studio-2019


【解决方案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);
                }
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2017-10-11
      • 1970-01-01
      • 2022-06-14
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多