引用另一个表c#linq中的行

时间:2014-04-27 22:17:04

标签: c# wpf linq

我想使用一个表中的id来列出wpf中另一个表的标题,所以我这样做了:

 var q = from a in context.associations
                select a;

        associations = q.ToList();
        associationViewSource.Source = associations;

        foreach (var item in q)
        {
            var qTitles = from b in context.textbooks
                          where b.Id == item.book_id
                          select b.Title;



            assocListView.ItemsSource = qTitles.ToList();
        }

在代码的第一部分我正在制作信息的主体,它列出了关联表中的所有信息,之后我想从教科书表中列出相关的标题,那就是我在assocListview中添加项目的地方,但它当然会失败,数据不会显示,也不会抛出任何错误。我希望我很清楚。 请帮忙

2 个答案:

答案 0 :(得分:1)

您可以获得Titles的{​​{1}}列表,其中包含associations加入...

var qTitles = context.textbooks
                    .Join(context.associations,
                          b => b.Id,
                          a => a.book_id,
                          b => b.Title)
                    .ToList();

代码的意图并不清楚,因为在循环的每次迭代中都分配了assocListView.ItemsSource。这是一个错误吗?

答案 1 :(得分:0)

由于您通过循环设置assocListView.ItemsSource,因此结果列表将包含上次查询的结果。

如果您想要所有相关标题的列表,可以通过一个查询获得它:

var titles = 
    from a in context.associations
    join b in context.textbooks on a.book_id equals b.Id
    select b.Title;

assocListView.ItemsSource = titles.ToList();

这将返回链接到关联表中任何记录的每个标题,没有特定顺序,带有重复项等。通常,提取更多信息以使其更有用是有意义的。例如,定义一个用于保存关联标题的结构:

public struct AssocTitle
{
    public int AssocID;
    public int BookID;
    public string Title;
}

然后查询它:

var titles = 
    from a in context.associations
    join b in context.textbooks on a.book_id equals b.Id
    select new AssocTitle { AssocID = a.Id, BookID = b.Id, Title = b.Title };

然后,当您单击列表视图中的内容时,您可以找出哪些书和哪个关联,即使您有相同标题的许多关联。