컨트롤러 작업 중 하나에서 0 개 이상의 Key : Value 쌍이있는 JSON 문자열을 사용하여 개체 컬렉션을 검색하는 ASP.NET Web API 서비스에서 작업하고 있습니다. 이 때문에 나는 콜렉션을 필터링하는 요청에 어떤 필드 이름이 올지 알지 못합니다.필드 이름을 알 수없는 동적 LINQ 식
이제 제공된 데이터를 기반으로 WHERE 표현식을 연결하여 동적 쿼리를 작성하는 코드가 있습니다. 이 경우 문제는 필터링해야 할 필드 이름을 알 수있을뿐만 아니라 필드 목록과 해당 값이 각 개체 내의 컬렉션에 저장되며 해당 컬렉션의 개체에는 두 가지 속성 만 있습니다. 이름과 값.
데이터가 제어 할 수없는 일련의 XML 파일에서 데이터를 deserialize하고 있으므로 (서식을 변경할 수 없음) 각 파일에 포함 된 필드 목록이 다를 수 있습니다. (아래의 클래스 정의 참조).
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class Bug
{
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public int ID { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public DateTime ChangedDate { get; set; }
[System.Xml.Serialization.XmlArrayAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("Field", typeof(BugField), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)]
public List<BugField> Fields {get; set;}
}
나는 다음과 같은 쿼리 모든 것이 잘 작동 실행하는 경우 - 나는 내가 JSON 요청에 기반을 찾고 결과를 얻을 수 - 해당 요청은 하나 개의 필드와 하나 개의 값에서 검색됩니다 그러나, 그리고 쿼리가 인덱스가 하드 올바른 필드의) (참고 - itemList에 아무 필터링 이전에 만든 모음)
itemList = (List<Bug>)itemList.Where(x => x.Fields[15].Value.ToString() == field.Value.ToString()).ToList();
내가 (제공되는 검색 필드를 기반으로 WHERE 식) 체인 동적 LINQ 쿼리를 만들 수있는 장소에 코드를 할 수있다 JSON 요청 (이 코드는 너무 길기 때문에 여기에 포함시키지 않아도됩니다. 물론 완전히 관련이 있습니다 ...). 그러나식이 구문 분석되는 방식에 따라 검색 할 속성의 이름을 참조 할 수 있어야합니다. 이름 속성의 값이므로 물론 알 수 없습니다.
이렇게 - 쿼리 매개 변수를 결정하는 필드 이름을 미리 고려하여 쿼리를 수정하는 방법은 무엇입니까?
편집 : 다음 코드 블록은 내가 사용하고자하는 (또는 동적 쿼리 작성기에서 작동하는) 것을 보여줍니다. 첫 번째 줄은 클래스의 필드 이름이 JSON 문자열에 제공된 필드 이름과 동일하게 정의 된 경우 잘 작동하는 코드입니다. 두 번째는 내부 컬렉션 필드 이름 속성에 접근하려고 시도한 시도 중 하나입니다.
foreach (KeyValuePair<string, object> field in queryFields)
{
itemList = itemList.Where<Bug>(field.Key, field.Value, (FilterOperation)StringEnum.Parse(typeof(FilterOperation), "eq"));
itemList = itemList.Where<Bug>(x => x.Fields.Any(y => y.Name == field.Key && y.Value == field.Value));
}
이 cs 파일 맨 위에'using System.Xml.Serialization'을 추가하지 않은 이유가 있습니까? 그것은 당신의 코드를 읽기가 어렵게 만든다. 이'using '문을 추가하면'System.Xml'을 제거 할 수 있습니다.속성 선언에서 '직렬화'를 선택합니다. 예 :'[System.Xml.Serialization.XmlArrayAttribute (..)'대신 [[XmlArrayAttribute (..)]. – Odys
@odyodyodys : 동의 함. 속성의 경우 C#에서 암시 하듯이 "Attribute"라는 꼬리표를 삭제할 수도 있습니다. – recursive
사실 - 아니, 이유가 없습니다. 일반적으로 나는 물건을 더 깔끔하게하기 위해 정확히 그것을한다. :) –