C# 在两个表联接后获取字符串列表

C# 在两个表联接后获取字符串列表,c#,wpf,linq-to-sql,C#,Wpf,Linq To Sql,我有两个表Card(cardID、cardName、setName)和Set(setID、setName、setMark)。我想将特定集合中的卡片名称添加到组合框项中 String setMark = comboBoxSetMark.SelectedItem.ToString(); comboBoxCardName.ItemsSource = (from cards in dataContext.Cards

我有两个表Card(cardID、cardName、setName)和Set(setID、setName、setMark)。我想将特定集合中的卡片名称添加到
组合框
项中

String setMark = comboBoxSetMark.SelectedItem.ToString();
comboBoxCardName.ItemsSource = (from cards in dataContext.Cards
                                            join sets in dataContext.Sets
                                            on cards.setID equals sets.setID
                                            where sets.setMark == setMark
                                            select new
                                            {
                                                cards.cardName
                                            }).ToList();
我在
组合框
项目选择中得到类似的结果:

{card name = Sylvan Caryatid}

如何仅获取cardName值?

您正在
选择
中选择新的匿名对象。WPF会自动调用此对象的
ToString()
方法来呈现视图中的项目。编译器生成
ToString()
的重写,该重写显示匿名对象中每个公共属性的值。 匿名对象的
ToString()
的结果是:

{Name1=Value1,Name2=Value2}

这一“意外”结果的原因是。您可以通过从查询中选择
string
来解决此问题

因此,请选择
string
objects,而不是:

comboBoxCardName.ItemsSource = (from cards in dataContext.Cards
                                join sets in dataContext.Sets
                                    on cards.setID equals sets.setID
                                where sets.setMark == setMark
                                select cards.cardName
                                ).ToList();

附加:

更好的解决方案是为控件创建一个新模型,该模型必须显示名称,但选择所选项的id

为此,您可以创建一个新类:

public class MyItem
{
   public int Id;
   public string Name;
}
然后从查询中获取列表:

comboBoxCardName.ItemsSource = (from cards in dataContext.Cards
                                join sets in dataContext.Sets
                                    on cards.setID equals sets.setID
                                where sets.setMark == setMark
                                select new { cardName = cards.cardName, cardId = cards.cardID }
                                ).AsEnumerable()
                               .Select(x => new MyItem { Id = x.cardName, Name= x.cardId })
                               .ToList();
然后在
.xaml
中为控件设置
DisplayMemberPath
SelectedValuePath

<ComboBox ...
          DisplayMemberPath="Name"
          SelectedValuePath="Id"/>


对于
选择卡片。cardID
它将生成列表,对吗?@Pochmunik是的,没错。@Pochmunik我也更新了我的答案,如果你想显示名称并获取所选项目的id。这也很有用,首先我需要在这里弄清楚两件事。谢谢,我有点问题