2010-08-04 3 views
1

Мне нужно немного вдохнуть откуда-то и надеяться, что кто-то сможет помочь.Linq Where Clause - Доступ к имени столбца таблицы

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

Я создал хранимую процедуру, которая сближает элементы автозаполнения и столбцы этих элементы являются производным от т.е.

tblAutoCompleteItems:

Item Column 
Item1 Product 
Item2 Product 
Item3 Product 
Red Category1 
Green Category1 
Blue Category1 
Small Category2 
Medium Category2 
Large Category2 

Я отсортированный в текстовом поле автозаполнение и работает отлично. Основываясь на выборе клиента, на этикетке отображается связанный столбец, из которого создается этот элемент (так что клиент может проверить, что они довольны возвратом их поиска). Прекрасный.

Однако сложный бит и бит, в котором мне нужна помощь, отбрасывают другой набор данных на основе критериев, которые они выбрали. Остальные наборы данные ищут что-то вдоль линий ...

tblProductInfo:

Product  Category1 Category2 
Item1  Red  Big 
Item2  Red  Small 
Item3  Blue  Small 

Например, пользователь autocompletes для «ITEM1», текстовое поле показывает это, а метка показывает 'продукт В качестве альтернативы, пользователь может захотеть выполнить поиск по Категории1, поэтому ищет «Красный», это отображается в текстовом поле, а на этикетке отображается «Категория1»

При просмотре tblProductInfo мне нужно как-то запросить набор данных, чтобы он смотрел на столбец автозаполнения и элемент автозаполнения.

Так что, когда я нажимаю кнопку или что-то еще, linq сначала смотрит на столбец, говорит: «О, я знаю, мне нужно посмотреть на Category1, а затем отбросить что-нибудь с красным в нем» или «ОК, это продукт, Сначала я перейду к столбцу «Продукт», а затем верну данные, связанные с Item1 «

Я борюсь в двух частях (1) Как получить доступ к именам столбцов в таблице и (2) построить где в linq.

Любая помощь, советы или рекомендации с благодарностью получены - даже если это означает, что полная стратегия переосмысливается.

Я использую C#, LINQ и asp.net.

By by by - Я понимаю, что это не идеальный вариант, когда автозаполнение просматривает полный стол, но это из моих рук ... к сожалению.

ответ

0

Невероятно, я сам справился с этим!Если кто-то натыкается это и искал что-то подобное, вот некоторые прекрасные псевдо-код:

public static List<tblInfo> GetProductInfo(string memberid, string locationid, string column, string acitem) 
     { 

      MyEntities getproductinfo = new MyEntities(); 

      var r = (from p in getproductinfo.tblProductInfo 
        where p.MemberId == memberid && 
           p.LocationId == locationid 
        select p); 

      if (column == "Product") 
       r = r.Where(p => p.Product == acitem); 

      if (column == "Category1") 
       r = r.Where(p => p.Category1 == acitem); 

return r.OrderBy(p => p.Product).ThenBy(p => p.Category1).ToList(); 
  • Где столбец = текстовая метка (в примере выше) acitem = запись в автозаполнения текстового поля MemberID & locationID - это просто сеансы, используемые повсюду.
+0

Почему бы не вернуть IEnumerable и покончить с .ToList(). Кроме того, где просто ожидает логический результат. Вы можете либо сделать другую функцию, которая возвращает логическое значение, и поместить вызов этой функции в ваш адрес. Или вы могли бы использовать? : оператор. –

+0

На самом деле, если вы читаете из реальной базы данных, это, вероятно, лучший (ну, с некоторыми изменениями, см. Мой ответ). Использование оператора?: Просто лишний раз поставит в оператор SQL много запутанных условий. –

0

Есть несколько способов получить метаданные; вы можете вытащить его из базы данных через хранимую процедуру (SQL, Oracle имеют представления, которые могут извлекать метаданные таблицы), или если вы используете LINQ to SQL, вы можете использовать Reflection, чтобы отразить класс, представляющий tblProductInfo.

Чтобы построить где положение, вы хотите использовать динамические LINQ: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Поскольку это позволяет использовать имена столбцов строки для выполнения запроса.

HTH.

+0

Спасибо за динамическое нажатие linq - это напомнило мне о чем-то другом, что я сделал, и поэтому создал следующее - это, вероятно, не «коррекция» или столь же эффективная, как это могло бы быть, но невероятно это работает !! –

0

Я не запускал его через компилятор, но я думаю, что синтаксис хорош. Если привести к IEnumerable

var r = (from p in getproductinfo.tblProductInfo 
     where p.MemberId == memberid 
      && p.LocationId == locationid 
      && column == "Product" ? p.Product == acitem : 
       column == "Category1" ? p.Category1 == acitem : true 
     orderBy p.Product 
     thenBy p.Category1 
     select p); 
+0

Мне это нравится - намного чище и лаконично. Спасибо за ввод. Извините, что я был толстым (все еще всего несколько месяцев в моей «развивающейся карьере»), но можете ли вы объяснить функцию? оператор? –

+0

это встроенный if. состояние ? trueReturn: falseReturn; И не стесняйтесь отмечать меня как ответ, если вы чувствуете, что я это сделал. Если вы не ставите свои вопросы в ответ, у них меньше стимулов давать ответы на будущие вопросы. БЛАГОДАРЯ!! :) –

0

небольшой модификации на твоем:

MyEntities getproductinfo = new MyEntities(); 

var r = (from p in getproductinfo.tblProductInfo 
      where p.MemberId == memberid && 
       p.LocationId == locationid 
      order by p.Product, p.Category1 
      select p); 

if (column == "Product") 
     r = r.Where(p => p.Product == acitem); 

if (column == "Category1") 
     r = r.Where(p => p.Category1 == acitem); 

return r.ToList(); 

LINQ поместит где в нужном месте.

Смежные вопросы