我有一个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
答案 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
以下查询的工作方式如下:
从当前TestedDrugs
panel
获取所有Panels
并仅选择具有相同测试药物的面板allTestedDrugs.All(..)
。
查询:
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; }
}