2013-01-14 34 views
7

试图让演唱会的名称,日期和地点(存储在另一个表) 但它似乎并没有工作,但它一直向后拉空。LINQ查询一对一

var test = from f in db.Concert 
      where f.Name.StartsWith(concertName) 
      select new 
      { 
       f.Name, 
       f.StartDateTime, 
       venues = from v in db.Venues 
         where v.ID == f.VenueID 
         select v.Address 
      } 

编辑:

场馆和音乐会之间的关系是音乐会具有涉及地点ID的VenueID。我需要传回一个字符串。像

foreach (var e in test) 
{ 
    html += "<div> e.Name +":" + e.Address </div>; 
} 
+0

您应该使用的导航性能。 ('f.Venue.Address') – SLaks

+0

它是'StartsWith'还是'Contains'? – Romoku

+3

是否需要.ToString()?,场地和音乐会表格之间的模型中是否还有任何类型的实用性?提供更多信息。 – MuhammadHani

回答

13

您可以使用组结合来获得有关演唱会的结果

var test = from f in db.Concert 
      join v in db.Venues on f.VenueID equals v.ID into g 
      where f.Name.StartsWith(concertName) 
      select new 
      { 
       f.Name, 
       f.StartDateTime, 
       Venues = g.Select(x => x.Address) 
      }; 

使用所有场馆:

foreach (var e in test) 
{ 
    // e.Name 
    // e.StartDateTime 

    foreach(var address in e.Venues) 
     // address 
} 
+1

只需要更改Venues = g.Select(x => v.Address)Venues = g.Select(x => x .Address) 这很好。它的1:1关系,所以我不认为我会需要第二个foreach。谢谢! – datatest

+0

@最感谢!对于错字,确定它应该是'x.Address' –

0

如果您设置了外键关系,则无需手动查询场地。在这种情况下,您使用f.Venue获得场地。

+0

相匹配,我可以做f.Venue,我不能做f.Venue.Address。并不知道如何获得地址 – datatest

+0

为什么你不能? – recursive

2

看起来假设音乐会和场地之间的1:1关系是安全的。鉴于此,您可以改用join

var test = from f in db.Concert 
      join v in db.Venues on v.ID equals f.VenueID 
      where f.Name.StartsWith(concertName) 
      select new 
      { 
       f.Name, 
       f.StartDateTime, 
       v.Address 
      }; 
+0

你是正确的1:1关系。尽管当你尝试你的代码时,我得到无法解析的名称,在v和f ... – datatest