连接两个表后获取字符串列表

Getting String List after join of two tables

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

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

我在 comboBox 项目选择中得到了类似的东西:

{card name = Sylvan Caryatid}

如何只获取cardName的值?

您正在 select 在您的 Select 中创建新的匿名对象。 WPF 自动调用此对象的 ToString() 方法来呈现视图中的项目。编译器 生成 ToString() 的覆盖 ,显示每个 的值 public 匿名对象中的属性ToString() 对于匿名对象的结果将是:

{ Name1 = Value1, Name2 = Value2 }

这个"unexpected"结果的原因是。您可以通过从查询中 selecting string 来解决此问题。

因此,select string 个对象:

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


补充:

更好的解决方案是为您的控件创建一个新模型,该模型必须显示名称,但 select selected 项目的 ID。

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

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:

中设置 DisplayMemberPathSelectedValuePath 供您控制
<ComboBox ...
          DisplayMemberPath="Name"
          SelectedValuePath="Id"/>