2016-08-21 2 views
1

У меня есть пять таблиц, которые связаны какLinq выбрать пять столов вниз

Chemicals -> Ингредиенты -> Решения -> Обычаи -> Проекты

на SQL-сервере, я хочу, чтобы получить проекты данных, относятся к химическим веществам и некоторые данные промежуточных таблиц. Я могу сделать это с помощью следующего запроса (по крайней мере, в LINQPad):

from c in Chemicals 
    join i in Ingredients on c.Chem_ID equals i.Chem_ID into TempTab01 
    from tt01 in TempTab01.DefaultIfEmpty() 
     join s in Solutions on tt01.Sol_ID equals s.Sol_ID into TempTab02 
      from tt02 in TempTab02.DefaultIfEmpty() 
       join u in Usages on tt02.Sol_ID equals u.Sol_ID into TempTab03 
        from tt03 in TempTab03.DefaultIfEmpty() 
         join pro in Projects on tt03.Study_ID equals pro.Study_ID into TempTab04 
         from tt04 in TempTab04.DefaultIfEmpty() 
select new 
{ 
c_ChemID = c.Chem_ID, 
c_Name = c.Name, 
i_ChemID = (int?)tt01.Chem_ID, 
i_Sol_id = (int?)tt01.Sol_ID, 
i_IngredID = (int?)tt01.Ingred_ID, 
tt01.Amount, 
s_SolID = (int?)tt02.Sol_ID, 
s_SolName = tt02.SolName, 
u_SolID = (int?)tt03.Sol_ID, 
u_StudyID = (int?)tt03.Study_ID, 
pro_StudyID = (int?)tt04.Study_ID, 
pro_StudyNo = tt04.StudyNo, 
pro_ProjectName = tt04.ProjectName 
} 

Я не хочу использовать соединение, но Свойства навигации вместо этого, но я не знаю, как использовать несколько Выбери или SelectMany для бурения до более чем двух таблиц.

Я использую EF6 для получения данных с SQL Server, класс edmx для химических веществ - e. г.

public long Chem_ID { get; set; } 
    public string Name { get; set; } 

    public virtual Person Person { get; set; } 
    public virtual Project Project { get; set; } 

    public virtual ICollection<Ingredient> Ingredients { get; set; } 
    public virtual ICollection<Usage> Usages { get; set; } 

, который имеет химический 1: м отношение к ингредиентам, ингредиенты для решения = 1: 1, Решения Usages = 1: м и Usages к проектам = 1: 1. Надеюсь, что это ответ на ваш вопрос.

+0

Можете ли вы показать навигационные свойства? –

ответ

2

Было бы неплохо, если бы вы предоставили определения классов свойствам навигации (один недостаток использования объединений в том, что мощность не совсем ясна).

Но принцип прост. Для свойства ссылочного типа навигации вы используете опцию let, для типа коллекции - from (необязательно добавление DefaultIfEmpty(), если требуется использовать внешнюю семантику соединения).

Так предполагая, модель выглядит так:

class Chemical 
{ 
    public ICollection<Ingredient> Ingredients { get; set; } 
} 

class Ingredient 
{ 
    public Chemical Chemical { get; set; } 
    public Solution Solution { get; set; } 
} 

class Solution 
{ 
    public ICollection<Ingredient> Ingredients { get; set; } 
    public ICollection<Usage> Usages { get; set; } 
} 

class Usage 
{ 
    public Solution Solution { get; set; } 
    public Project Project { get; set; } 
} 

class Project 
{ 
    public ICollection<Usage> Usages { get; set; } 
} 

тогда запрос будет выглядеть так:

from c in db.Chemicals 
from i in c.Ingredients.DefaultIfEmpty() 
let s = i.Solution 
from u in s.Usages.DefaultIfEmpty() 
let p = u.Project 
... 
+0

Привет @Хак, я должен был отклонить ваше редактирование, потому что ему не разрешено отвечать внутри ответов, но я прочитал ваш ответ и действительно ценю его! Поэтому, пожалуйста, рад, что это помогло. То, что вы можете сделать, хотя (не обязательно), есть, ну, вы можете видеть здесь [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers). Приветствия. –