DynamicQuery: как выбрать столбец с запросом linq, который принимает параметры - PullRequest
1 голос
/ 30 марта 2010

Мы хотим создать каталог всех организаций, работающих с нами. Они невероятно разнообразны (правительство, посольства, частные компании и организации в зависимости от них). Итак, я решил создать 2 таблицы. Таблица 1 будет одинаково относиться ко всем организациям, то есть будет собирать всю основную информацию (имя, адрес, номер телефона и т. Д.). Таблица 2 установит иерархию среди всех организаций. Например, Программа для неграмотных взрослых зависит от Национального института социального обеспечения , который зависит от труда Министерство .

В таблице иерархии каждый столбец представляет уровень. Так, для приведенного выше примера, (i) Министерство труда - Уровень 1 (столбец 1), (ii) Национальный институт социального обеспечения - Уровень 2 (столбец 2), (iii) Программа для неграмотных взрослых - Уровень 3 (столбец 3).

Чтобы прикрепить организацию к иерархии, пользователь должен переходить уровень за уровнем (т.е. столбец за столбцом). Итак, будет как минимум 3 ситуации:

  • Если для организации существует адекватная иерархия (например, уровень 1: посольство США), эту организацию можно добавить (например, уровень 2: USAID) .--> Посольство США / USAID и т. Д.
  • Как насчет того, если один или несколько уровней отсутствуют? - тогда их нужно добавить
  • Как насчет того, нужно ли изменить иерархию? - не каждая вещь нуждается в модификации.

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

Допустим, у меня есть эти запросы в моем хранилище (просто, чтобы вы поняли).

Query1

var orgHierarchy = (from orgH in db.Hierarchy
                   select orgH.Level1).FirstOrDefault;

Query2

var orgHierarchy = (from orgH in db.Hierarchy
                   select orgH.Level2).FirstOrDefault;

Query3, Query4 и т. Д.

Вышеуказанные запросы одинаковы, за исключением запрошенного свойства (level1, level2, level3 и т. Д.)

Вопрос: Есть ли общий способ написания вышеупомянутых запросов в одном? Чтобы пользователь мог отслеживать уровень иерархии по уровням, чтобы присоединить организацию.

Другими словами, заранее не зная, какой столбец запрашивать, мне все равно нужно это делать в зависимости от некоторых условий. Например, организация X зависит от Y . Зная, что Y находится где-то на 3-м уровне, я перейду на 4-й уровень, связав X с Y .

Мне нужно выбрать (не вручную) столбец только с одним запросом, который принимает параметры.

======================= EDIT

Как я только что сказал @Mark Byers, все, что я хочу, это просто иметь возможность запрашивать столбец, не зная заранее, какой из них. Проверьте это:

Как насчет этого

Public Hierarchy GetHierarchy(string name)
{
  var myHierarchy = from hierarc in db.Hierarchy
                    where (hierarc.Level1 == name)
                    select hierarc;
  retuen myHierarchy;  
}

Выше запрос зависит от имени, которое является переменной. Это может быть министерство планирования, посольство, местный телефон и т. Д.

Могу ли я написать тот же запрос, но на этот раз вместо просмотра большого значения в БД я навязываю свой запрос для выбора определенного столбца.

var myVar = from orgH in db.Hierarchy
            where (orgH.Level1 == "Government")
            select orgH.where(level == myVariable);
return myVar;

Я не претендую на то, что select orgH.where (level == myVariable) даже близок к действительности. Но это то, что я хочу: иметь возможность выбирать столбец в зависимости от переменной (то есть значение не известно заранее, как с name ).

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 30 марта 2010
1 голос
/ 30 марта 2010

Ваша база данных не нормализована, поэтому вы должны начать с изменения таблицы heirarchy, например:

OrganizationId Parent
1              NULL
2              1
3              1
4              3

Для запроса вам может потребоваться рекурсивный запрос. Это сложно (но не невозможно) с помощью LINQ, поэтому вместо этого вы можете предпочесть создать параметризованную хранимую процедуру с использованием рекурсивного CTE и поместить запрос туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...