2012-12-06 42 views
0

我刚开始学习一些Odata,我需要某些查询方面的帮助。Linq和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中是否正确?我不确定多对多的关系。

例如,在第三个例子,其中我有许多一对多关系beetween媒体和元数据(TvSchedules.Where(S => s.Date<周& & s.Media.Metadata.Select(A = > a.IsHD).Contains(true)))。我只需要选择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) ? 

谢谢

+0

检查查询是否正确的最好方法是实际运行它们。你在运行时遇到问题吗? –

+0

问题是我没有数据库中的项目。我试图根据我上面写的linq查询来查明我的odata查询是否合适。 – Kosmog

回答

0

这类型的查询,除了第一个,是语法和语义正确的,但他们也是有问题的可读性,性能,因为它是很难组成的OData过滤条件。

我走过那条路,越往前走,就越觉得疼痛。我的建议是为他们创建sql视图:

  1. 这很好,因为它很简单。
  2. 创建Today_TV_Schedule SQL视图
  3. 创建Today_HDTV_Schedule(它使用Today_TV_Schedule)

在此之后,映射你的实体,您将能够更容易:

var second = TvSchedules; 
var third = HdTvSchedules; 

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

祝你好运!

+0

好的。谢谢。你是对的。对不起,我迟到的答案 – Kosmog