簡體   English   中英

Linq和Odata過濾器,展開並選擇

[英]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視圖:

  1. 沒關系,因為它很簡單。
  2. 創建Today_TV_Schedule sql視圖
  3. 創建Today_HDTV_Schedule(使用Today_TV_Schedule)

之后,映射您的實體,您將可以使它變得更容易:

var second = TvSchedules;
var third = HdTvSchedules;

OData查詢也將更加容易。 請考慮我的建議。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM