티스토리 뷰

반응형

지난 포스트에서 WebAPI를 이용한 CRUD에 대해서 알아보았다. 이번에는 지난번 소스에서 추가적으로 OData를 이용해서 조회하는 방법에 대해서 알아보도록 하자. OData를 이용하면 url에서 query를 만들어서 data 조회를 할 수 있어서 매우 편리하다.

 

* 이전 포스트

WebAPI CRUD Sample

http://kaki104.tistory.com/entry/WebAPI-CRUD-Sample-Framework-45-MVC4-Windows-8-RTM-app-base

 

 

예를 들어,

http://localhost:11666//api/person/1

 

위와 같이 하면 id가 1인 레코드 1개를 반환한다. 그런데 이름에 'kaki'라는 문자열이 들어가는 레코드를 모두 반환할려면 어떻게 해야하나? 또 여러개의 조건을 만족하는 레코드를 반환할려면? 이런 경우 가장 간단한 해결책이 OData query를 이용하는 방법이다.

 

http://localhost:11666//api/person?$filter=(substringof('kaki',Name) eq true) and (Age gt 20)

 

위에서 이야기한 조건을 url query로 만들어 보았다.

 

 

* 참고 포스트

OData

http://www.odata.org/media/30002/OData.html

Microsoft ASP.NET Web API OData

http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData

Querying ASP.NET Web API with OData querying parameters

http://tumivn.com/post/2012/4/5/Querying-ASPNET-Web-API-with-OData-querying-parameters.aspx

 

 

1. WebAPI 프로젝트에 OData를 추가한다.

 

 Nuget Packages에서

1) Include Prerelease로 변경한다.

2) 검색어로 odata를 입력

3) 2page에서 찾아서 선택하고 인스톨한다.

 

 

 

2. PersonControler


[Queryable] //추가
public IQueryable<Person> GetPeople()
{
    return db.People;
}
...

...

여기까지 하면 OData query를 사용할 준비가 완료된다.

 

3. MainPageViewModel.cs

 

...

        private string qName;
        /// <summary>
        /// 쿼리 이름
        /// </summary>
        public string QName
        {
            get { return qName; }
            set
            {
                qName = value;
                OnPropertyChanged();
            }
        }

        private int qAge;
        /// <summary>
        /// 쿼리 나이
        /// </summary>
        public int QAge
        {
            get { return qAge; }
            set
            {
                qAge = value;
                OnPropertyChanged();
            }
        }

        private string qOrderBy;
        /// <summary>
        /// 쿼리 정렬 순서
        /// </summary>
        public string QOrderBy
        {
            get { return qOrderBy; }
            set
            {
                qOrderBy = value;
                OnPropertyChanged();
            }
        }

...

 

        private DelegateCommand getCommand;
        /// <summary>
        /// 조회 커맨드
        /// </summary>
        public DelegateCommand GetCommand
        {
            get
            {
                if (getCommand == null)
                {
                    getCommand = new DelegateCommand(
                        async _ =>
                        {
                            string OdataQuery = string.Empty;
                            string condition = string.Empty;
                            string conName = string.Empty;
                            string conAge = string.Empty;
                            string ord = string.Empty;


                            if(QName != null && QName.Length > 0)
                            {   //{0}?$filter=
                                conName = string.Format("(substringof('{0}',Name) eq true)", QName);
                            }
                            if (QAge > 0)
                            {
                                conAge = string.Format("(Age gt {0})", QAge.ToString());
                            }
                           
                            if(conName.Length > 0 && conAge.Length > 0)
                            {
                                condition = string.Format("$filter={0} and {1}", conName, conAge);
                            }
                            if (conName.Length > 0 && conAge.Length == 0)
                            {
                                condition = string.Format("$filter={0}", conName);
                            }
                            if (conName.Length == 0 && conAge.Length > 0)
                            {
                                condition = string.Format("$filter={0}", conAge);
                            }

                            if (QOrderBy != null && QOrderBy.Length > 0)
                            {
                                ord = string.Format("$orderby={0} desc", QOrderBy);
                            }

                            if (condition.Length > 0 && ord.Length > 0)
                            {
                                OdataQuery = string.Format("{0}?{1}&{2}", ApiRoot, condition, ord);
                            }
                            if (condition.Length > 0 && ord.Length == 0)
                            {
                                OdataQuery = string.Format("{0}?{1}", ApiRoot, condition);
                            }
                            if (condition.Length == 0 && ord.Length > 0)
                            {
                                OdataQuery = string.Format("{0}?{1}", ApiRoot, ord);
                            }
                            if (OdataQuery.Length == 0)
                            {
                                OdataQuery = string.Format("{0}", ApiRoot);
                            }

                            //http 설정
                            var http = new HttpClient();
                            //전체 데이터 조회
                            var resp = await http.GetAsync(new Uri(OdataQuery));
                            if (resp.IsSuccessStatusCode)
                            {
                                //성공이면 반환데이터 읽어서 JsonConvert로 Object로 변환
                                var result = await resp.Content.ReadAsStringAsync();
                                People = JsonConvert.DeserializeObject(result, typeof(ObservableCollection<Person>)) as ObservableCollection<Person>;
                            }
                        });
                }
                return getCommand;
            }
        }

 

4. 실행해서 결과를 살펴 보도록 하자

 

 조건이 없으면 전체 조회

 

이름 조건 : 104를 입력 후

 

이름 조건 : 104, 나이 조건 : 20

 

정렬 순서 : Name 역순으로

 

5. 소스

SkyDrive folder / 소스용량이 18매가라..올릴 수가 없군요

W8RP_c#_MVC4_WebAPI_OData_sample_WebApiSample.v11.zip

http://sdrv.ms/Tp6Ugw
반응형
댓글