2010-04-14 2 views
0

오른쪽의 이상한 질문; 나는 XML 작업에 최근 linq을하고있다. (내 최근의 다른 게시물 herehere을 보라).# linq to xml 동적 쿼리

는 기본적으로,이 텍스트 상자는이 값이 쿼리에 포함되기 전에, 널과 같이 여부를 확인하는 쿼리를 만들 수 있도록하려면 :

XDocument db = XDocument.Load(xmlPath); 
var query = (from vals in db.Descendants("Customer") 
      where (if(textbox1.Text != "") {vals.Element("CustomerID") == Convert.ToInt32(textbox1.Text) } || 
        if(textbox2.Text != "") {vals.Element("Name") == textbox2.Text}) 
      select vals).ToList(); 

답변

1

그냥 일반 부울 연산자를 사용을 & & 및 || : 원래 코드의 단지 직접 번역의

XDocument db = XDocument.Load(xmlPath); 
var query = (from vals in db.Descendants("Customer") 
      where (textbox1.Text != "" && 
       vals.Element("CustomerID") == Convert.ToInt32(textbox1.Text)) || 
       (textbox2.Text != "" && vals.Element("Name") == textbox2.Text) 
      select vals).ToList(); 

-하지만 난 당신이 intvals.Element("CustomerID")에서 캐스팅을 할 것입니다 생각하고, 당신이 정말로 012을 변환하고 싶지 않아 모든 반복마다이 나옵니다. 또한 "이름"XElement을 문자열로 변환해야합니다. 어때요?

int? customerId = null; 
if (textbox1.Text != "") 
{ 
    customerId = int.Parse(textbox1.Text); 
} 

XDocument db = XDocument.Load(xmlPath); 
var query = (from vals in db.Descendants("Customer") 
      where (customerId != null && 
       (int) vals.Element("CustomerID") == customerId) || 
       (textbox2.Text != "" && 
       (string) vals.Element("Name") == textbox2.Text) 
      select vals).ToList(); 

또는 두 부분의 쿼리를 분리하고 결과를 함께 "결합"할 수 있습니다. 또는 선호하는 IMO - 더 동적으로 쿼리를 작성할 수 있습니다.

var query = db.Descendants("Customer"); 
if (textbox1.Text != null) 
{ 
    int customerId = int.Parse(textbox1.Text); 
    query = query.Where(x => (int) x.Element("CustomerID") == customerId); 
} 

if (textbox2.Text != null) 
{ 
    query = query.Where(x => (string) x.Element("Name") == textbox2.Text); 
} 
List<XElement> results = query.ToList(); 
+0

환상적인 다시 Jon. 이미 두 번째 옵션에서 언급했듯이 값에 대해 알아 보았습니다. 위 코드를 사용하면 더 간단하게 만들 수 있습니다. 대단히 감사합니다! –