繁体   English   中英

EF如何避免相同的数据在.select

[英]EF how to avoid same data in .select

我正在使用实体框架。 我正在使用带有.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)。

GROUP BY语句通常与聚合函数( COUNT, MAX, MIN, SUM, AVG )一起使用,以按一列或多列对结果集进行分组。

在 Where 子句之后使用GROUP BY column_name(s)

您可以尝试使用 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);
            }

结果:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM