匿名强制类型异常

时间:2013-05-16 12:48:42

标签: c# wpf linq xaml

我有一个LINQ to EF查询,我在其中选择实体t_Klantenhistory的一些列。此查询是datagrid dgHistory的项目源。自动生成列设置为true。当我想从dgHistory获取所选项时,代码会抛出错误说明:

  

“无法将类型'&lt;&gt; f__AnonymousType5`5 [System.Int32,System.String,System.String,System.String,System.String]'的对象转换为'AOV.t_Klantenhistory'。”< / p>

当我选择所有列时,这工作正常,但我不想要所有列。我该如何解决这个问题?

CODE:

public KlantenHistory()
{
    InitializeComponent();
    entities = new AOVEntities();

    var query = (from cust in entities.t_Klantenhistory
                 select new
                 {
                     cust.ID,
                     cust.IdNo,
                     cust.Naam,
                     cust.Voornamen,
                     cust.VolgNo
                 });

    dgHistory.DataContext = entities.t_Klantenhistory;
    dgHistory.AutoGenerateColumns = true;
    dgHistory.ItemsSource = query.ToList();
}

private void btToonHistory_Click(object sender, RoutedEventArgs e)
{
    s_history = new SpecifiekeHistory();
    t_Klantenhistory klant = (t_Klantenhistory)dgHistory.SelectedItem;
    s_history.GetKlantHistory(klant.ID);
    s_history.Show();
}

2 个答案:

答案 0 :(得分:1)

您正尝试在t_Klantenhistory事件中将匿名类型对象转换为btnToonHistory_Click。在您的select语句中,您使用new关键字,即创建anonymous type对象。

您可以创建一个新的临时类和项目。您无法投射到t_Klantenhistory,因为它是框架中生成的类。

另一种方法是从select cust而不是select new ...中选择表中的所有内容,然后隐藏您不希望在网格中显示的列dgHistory

答案 1 :(得分:1)

您正在创建一个匿名类型,用于存储查询结果。因此,这不是您检索的t_Klantenhistory实例。

您可以使用动态关键字解决问题:

dynamic klant = dgHistory.SelectedItem;
s_history.GetKlantHistory(klant.ID);