티스토리 뷰
WebAPI OData query sample - Framework 4.5, MVC4, Windows 8 RP, RTM app base
kaki104 2012. 9. 7. 12:04지난 포스트에서 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'Previous Platforms > HTML5 & MVC4' 카테고리의 다른 글
Web Api Routing for multiple Get methods in ASP.NET MVC 4 (0) | 2013.02.28 |
---|---|
SignalR을 사용한 영화 예매 시스템 구현 (2) | 2012.11.02 |
MVC4 tips (0) | 2012.08.31 |
WebAPI CRUD Sample - Framework 4.5, MVC4, Windows 8 RTM app base (0) | 2012.08.20 |
MVC4 - Single Page Application (SPA) (2) | 2012.04.18 |
- Total
- Today
- Yesterday
- UWP
- LINQ
- Cross-platform
- ef core
- #prism
- dotNETconf
- Build 2016
- XAML
- ComboBox
- Microsoft
- C#
- windows 11
- MVVM
- PRISM
- #MVVM
- #Windows Template Studio
- Bot Framework
- WPF
- Behavior
- Windows 10
- .net 5.0
- visual studio 2019
- uno-platform
- Visual Studio 2022
- Always Encrypted
- .net
- #uwp
- kiosk
- uno platform
- IOT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |