有2个表:db.Tags(ID,TagName)和db.Names(ID,Name,TagID)。
我想获取所有db.Tags行以及与TagID匹配的所有Name。
所以它看起来像
ID - TagName - Names
1 - tag1 - name1, name2, name3
2 - tag2 - name4, name5, name6
这可能在一个(长)linq查询中吗? 或者我必须得到所有标签,然后做foreach标签,获取所有名称,然后做foreach名称将它们放在一个长字符串中..
提前致谢!
编辑:
好的,看看我对第二个答案的评论(第一个......),这是我尝试的但是我在编译器中遇到了一些错误:
var tags =
from t in db.Tags
orderby t.Priority ascending
select new {
t.ID,
t.Name,
t.Priority,
Places = String.Join(", ",
(from p in db.Places
join o in db.TagToPlaces on new {
p.ID,
t.ID
}
equals new {
o.PlaceId,
o.TagId
}
select p.Name
).ToArray()
)
}
);
答案 0 :(得分:2)
我认为这就是你所追求的:
var query =
from t in db.Tags
select new
{
t.ID,
t.TagName,
Names = String.Join(", ",
(from n in db.Names
where n.TagID == t.ID
select n.Name)
.ToArray()),
};
有了这个,我得到你在问题中给出的那种输出。我也明白你想要输出标签ID和名称,即使没有相关的名字记录 - 我的查询也是如此。
现在,根据您是否使用EF或LINQ-to-SQL或其他内容,您可能需要将.ToArray()
添加到db.Tags
& db.Names
引用强制数据库查询发生。
如果您有大量标记记录,您会发现有大量查询要进入数据库。您可以进行此更改以将其减少为仅两个查询:
var tags = db.Tags.ToArray();
var names = db.Names.ToArray();
var query =
from t in tags
select new
{
t.ID,
t.TagName,
Names = String.Join(", ",
(from n in names
where n.TagID == t.ID
select n.Name)
.ToArray()),
};
现在你只需要确保你的数据适合内存 - 但听起来应该是这样。我希望这会有所帮助。
答案 1 :(得分:-1)
由于concat是TSQL的一个难题,我会“按原样”查询3个值,并从那里进行格式化:
var list = (from tag in db.Tags
join name in db.Names
on tag.ID equals name.TagId
orderby tag.ID
select new { tag.ID, tag.TagName, name.Name }).ToList();
例如,如果我想通过tag-id获取名称,我可以这样做:
var namesByTag = list.ToLookup(row => row.ID, row => row.Name);
(或您选择的任何其他内容)