ASP.NET:Linq2SQL:选择与id匹配的所有名称

时间:2010-12-06 12:51:55

标签: asp.net linq

有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()
             ) 
        }
    );

2 个答案:

答案 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);

(或您选择的任何其他内容)