[英]Linq and Odata filter,expand and select
我剛剛開始學習一些Odata,並且在進行某些查詢時需要幫助。
讓我們以2-3個Linq查詢為例。 (注意:查詢列表)
1) var one = Users.Single(s => s.ID == 1).Sources.Where(s =>s.Genre.Name == "Sport").ToList();
2) var second = TvSchedules.Where(s => s.Date.Day == DateTime.Today && s.Source.Type == "Channel"). Select(s => new {s.Media.Title,s.Media.Details.Description,s.Media.Images.FirstOrDefault(a=>a.ID==s.Media.ID).Link, s.Source.Sign}).ToList();
3) var third = TvSchedules.Where(s => s.Date < week && s.Media.Metadata.Select(a => a.IsHD).Contains(true)).Select(s => new { s.Media.Title, s.Media.Details.Description, s.Media.Images.FirstOrDefault().Link, s.Media.Metadata.FirstOrDefault().PriceSD, s.Media.RTRating }).ToList();
這些查詢是什么? (注意:解釋查詢列表)
1) I am selecting all Sources from User with ID=1 where source genre = 'Sport' ( I use User and Sources database tables )
2) I am querying only TVSchedules from Today where TVSchedules.Sources.Name = 'Channel' and I am selecting from TvSChedules.Media ( Title ), TvSchedules.Media.Details( Description), TvSchedules.Media.Images( Link ), TvSchedules.Source.Sign
In TvSchedules database table I have 2 FK ( MediaID, SourceID )
3) Like the second one, but I add some filters. I want to check if TvSchedules.Media.Metadata.isHd ==true
我的問題 (注意:基於上述查詢的問題)
問題A)這些查詢在Linq中正確嗎? 我不確定多對多關系。
例如,在第三個示例中,我在媒體和元數據之間存在多對多關系( TvSchedules.Where(s => s.Date <week && s.Media.Metadata.Select(a => a.IsHD)。 Contains(true)) )。 我只需要選擇日期<week和Media.Metada.isHd = true的TvSchedules 。
我的TvSchedules表看起來像這樣
ID MediaID SourceID Date
-- ------ -------- ----
問題B)如何在ODATA(開放數據協議)查詢中轉換這些查詢?
1) /Users(1)/AvailableSources?&filter=Genres eq 'Sport'
2) /TvSchedules?&filter=Date eq '@today'?$expand=Media,Details,Images?$select=Title,Description,Link
3) ?
謝謝
除第一個查詢外,此類查詢在語法和語義上都是正確的,但它們在可讀性,性能以及難以組成odata過濾器標准方面也存在問題。
我走了那條路,更多的你前進,感覺到更多的痛苦。 我的建議是為其創建sql視圖:
之后,映射您的實體,您將可以使它變得更容易:
var second = TvSchedules;
var third = HdTvSchedules;
OData查詢也將更加容易。 請考慮我的建議。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.