2010-08-04 5 views
1

어딘가에서 영감을 받아야하고 누군가를 원한다면 누구든지 도움을 줄 수 있습니다.Linq Where 절 - 테이블 열 이름에 액세스

이것은 전 데이터 테이블, 즉 모든 열의 모든 데이터에 대해 자동 완성 검색을 수행하고자하는 이전 스레드에서 생성됩니다.

나는이 항목 즉

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 

예를 들어, '항목 1'에 대한 사용자 자동 완성은 텍스트 상자이 표시되고 다른 방법으로 라벨 표시 '제품' 사용자가 Category1로 검색하여 'Red'를 검색하려고 할 수 있습니다.이 텍스트 상자에 표시되고 'Category1'이 표시됩니다.

tblProductInfo를 보면 어떻게 든 데이터 세트를 조회해야합니다. 자동 완성 항목 및 자동 완성 항목

그래서 단추를 눌렀을 때 linq는 먼저 열을보고 "아, 내가 Category1을보고 나서 다시 빨간색으로 무엇인가를 가져야합니다"또는 "제품은 괜찮습니다. 먼저 Product 열로 이동 한 다음 Item1과 관련된 데이터를 다시 가져옵니다. "

두 부분으로 어려움을 겪고 있습니다. (1) 테이블 내에서 열 이름에 액세스하는 방법 (2) 절을 linq.

완벽한 전략을 다시 생각해도 도움이 되었으면 도움, 조언 또는 조언을 보내주십시오.

나는 이것을 C#, LINQ 및 asp.net을 사용하여 attmepting합니다.

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를 나타내는 클래스에 반영 할 수 있습니다. 이 쿼리를 수행하기 위해 문자열 열 이름을 사용할 수 있습니다으로 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

:

절은, 동적 LINQ를 사용하는 것이 좋습니다 어디를 구성합니다.

HTH.

+0

동적 linq 푸시 주셔서 감사합니다 - 내가 한 일을 생각 나게하고 따라서 다음을 생산 - 그것은 아마도 'correc'또는 그것이 될 수있는만큼 효율적이지만 믿을 수 없게 작동합니다! –

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 적절한 장소에 어디를 넣어 것입니다.