如何获取包含来自另一个表的许多元素的所有行

时间:2015-04-11 03:34:32

标签: c# entity-framework

我有一个DB结构,如下图所示。在这种情况下,我试图确定当用户选择Panel或Class时如何获取所有相关的Panel。关键是DAT_TestedDrugs,相关的Panel必须包含所选Panel的所有DAT_TestedDrugs。

示例:用户选择面板A. 小组A有TestedDrugs B和C

Panel X& Y还含有经测试的药物B和C

因此,结果应该是面板A,面板X和面板Y

我正在为此应用程序使用C#和Entity Framework

enter image description here

2 个答案:

答案 0 :(得分:1)

从图片中您可能看到类似于以下类的内容,这些类代表您在c#中的数据:

public class Panel
{
    public int ID { get; set; }
    public List<DrugClass> DrugClasses { get; set; }
}

public class DrugClass
{
    public int ID { get; set; }
    public List<TestedDrug> TestedDrugs { get; set; }
}

public class TestedDrug
{
    public int ID { get; set; }
}

其中Panel对象具有DrugClass对象列表,每个DrugClass对象都有一个TestedDrug对象列表。

然后,此方法应该为您提供所需的结果:

    public static List<Panel> GetPanelsWithSameTestedDrugs(List<Panel> panelList, Panel selectedPanel)
    {
        var testedDrugs = panelList
            .Where(panel => panel == selectedPanel)
            .SelectMany(panel => panel.Drugs)
            .SelectMany(drugClass => drugClass.TestedDrugs)
            .Distinct()
            .OrderBy(testedDrug => testedDrug.ID);

        var panels = panelList.Where(panel => panel.DrugClasses
                                    .SelectMany(drugClass => drugClass.TestedDrugs)
                                    .Distinct()
                                    .OrderBy(testedDrug => testedDrug.ID)
                                    .SequenceEqual(testedDrugs));

        return panels.ToList();
    }

其中paneList是您正在处理的面板列表(可能是整个表格,但不是必需的),而selectedPanel是用户选择的面板。

这应返回一个面板列表,其中每个面板与selectedPanel具有相同的测试药物。该列表也包括selectedPanel(可以随意删除)。

重构以适应目的......

答案 1 :(得分:1)

您的关系面板 - &gt; TestedDrug 它有点复杂,因为它的 Panel 有很多有很多 TestedDrugs

以下查询的工作方式如下:

  1. 从当前TestedDrugs

  2. 获取所有panel
  3. 获取所有Panels并仅选择具有相同测试药物的面板allTestedDrugs.All(..)

  4. 查询:

    var panel = // take from db
    var panels = // get all from db
    var allTestedDrugs = panel.DrugClasses.SelectMany(dg => dg.TestedDrugs).ToList();
    var samePanels = panels.Where(p => allTestedDrugs.All(
                        testedDrug => p.DrugClasses.SelectMany(dg => dg.TestedDrugs)
                                                .Any(td => testedDrug.Id == td.Id))
                    );
    

    您在C#中的实体如下所示。

    public class DomainObject {
        public int Id { get; set; }
    }
    
    public class Panel : DomainObject{
        public List<DrugClass> DrugClasses { get; set; }
    }
    
    public class DrugClass : DomainObject {
        public List<TestedDrug> TestedDrugs { get; set; }
        public List<Panel> Panels { get; set; }
    }
    
    public class TestedDrug : DomainObject {
        public List<DrugClass> DrugClasses { get; set; }
    }