2011-11-14 143 views
2

我有两个表格,它们之间存在一对多关系,并且希望执行一个linq查询,该查询将从多个表中获取值并生成逗号分隔列表来自与另一个表中的每个记录相关的值。我可以使用“stuff”函数和“for xml path”函数在sql中执行此查询。例如,假设我有以下表结构:使用linq将列表中的逗号分隔列表转换为列

1)区
列:ID,名称
2)店铺
列:ID,姓名,districtid

现在假设我想生成查询返回以下列: district.id,district.name,stores(与本区关联的商店的逗号分隔列表)

这怎么能通过linq实现?

我想这样做没有任何for循环,在一个查询中。

回答

5

其他答案考虑到你有导航属性。 如果是这种情况,你应该看看其他答案,因为在这种情况下,其他答案要简单得多。

var result = 
    from d in Districts 
    // gets all the store names in this district 
    let st = Stores.Where(s => s.DistrictId == d.Id).Select(s => s.Name) 
    select new { Name = d.Name, Id = d.Id, Stores = string.Join(",", st) } 
+0

这可能更简单了...但是如果数据有“或者,那么它将不起作用......也还是n发表前面和后面的报价 –

0

假设你有导航属性:

var q = from d in context.Districts 
select new 
{ 
    DistrictID = d.id, 
    DistrictName = d.name, 
    Stores = String.Join(", ", d.stores.Select(s => s.name)) 
}; 
0

如果您正在使用LINQ到SQL,那么你必须已经具有导航属性创建你的ORM类,然后你可以运行下面的代码(我推测商店因LINQ中的多元化而变成了Store_s_等):

var req = from dis in db.Disticts 
      select new { 
         ID = dis.id, 
         Name = dis.Name, 
         Stores = 
         String.Join(", ", 
         dis.Stores.Select(a => String.Format("{0}: {1}", a.Id, a.Name)) 
         }; 
+0

我试过这个变化。 SELECT语句似乎返回IEnumerable,因为Join似乎返回string []。有什么额外的,我需要做的。 – user927777

+0

String.Join()应该返回一个“连接”的字符串,而不是一个数组...你可以发布你的变体? –

+0

没关系..我明白了。谢谢。 – user927777

相关问题