Linq和Odata过滤器,展开并选择

时间:2012-12-06 09:53:25

标签: c# sql linq entity-framework odata

我刚开始学习一些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 =&gt; s.Date&lt; week&amp;&amp; s.Media.Metadata) 。选择(a =&gt; a.IsHD)。包含(true)))。我只需要选择具有日期&lt;的TvSchedules。周和Media.Metada.isHd = true

我的 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) ?

谢谢

1 个答案:

答案 0 :(得分:0)

除了第一个查询之外,这种查询在语法和语义上都是正确的,但它们在可读性,性能方面也存在问题,并且因为很难编写odata过滤条件。

我走在那条路上,你越前行,感觉越痛苦。我的建议是为他们创建sql视图:

  1. 没关系因为它很简单。
  2. 创建Today_TV_Schedule sql视图
  3. 创建Today_HDTV_Schedule(它使用Today_TV_Schedule)
  4. 在此之后,映射您的实体,您将能够更轻松:

    var second = TvSchedules;
    var third = HdTvSchedules;
    

    OData查询也会更容易。请考虑我的建议。

    祝你好运!