2013-04-04 107 views
0

我有以下表格:插入项目到DataGrid中

enter image description here

我使用实体框架数据库第一,因此会生成以下实体类:

public partial class Sal1 { 
    public string SaleID { get; set; } 
    public string ItemID { get; set; } 
    public int Quantity { get; set; } 
    public decimal Total { get; set; } 

    public virtual Item Item { get; set; } 
    public virtual Sale Sale { get; set; } 
} 

然后把SAL1行如下这样的数据网格:

private List<Sal1> saleItems = new List<Sal1>(); 
... 
var query = from sa in db.Sal1 
      where sa.SaleID.Equals(tempSale) 
      select sa; 
foreach(Sal1 si in query) { 
    saleItems.Add(si);      
} 
... 
dgDetails.ItemsSource = saleItems; 

但它tu RNS出这样的: enter image description here

我的问题是,我应该怎么调整上面的查询,使我得到了下面的SQL相当于:

select T0.SaleID, T0.ItemID, T1.Name, T0.Quantity, T0.Total 
from Sal1 T0 inner join Item T1 on T0.ItemID = T1.ItemID; 

在此先感谢。


编辑:我似乎已经找到了解决办法,但我不得不这样做:

var query = from sa in db.Sal1 
     where sa.SaleID.Equals(tempSale) 
     select new { sa.SaleID, sa.ItemID, sa.Item.Name, 
      sa.Item.Manufacturer, sa.Quantity, sa.Total }; 

我不得不改变saleItems到对象的类型。

private List<object> saleItems = new List<object>(); 

这是最好的方法吗?

+1

还有一件事(除了我的回答和下面的评论):EF已经自动创建了一个名为'Sal1'的类,它将数据库表中的所有表列作为类属性。因此,在LINQ查询中执行类似'select sa'的操作将返回'Sal1'对象的集合,因为从db.Sal中的sa查询的第一部分已经告诉LINQ关于'sa'的__type__。但是,当您执行JOIN时,您(通常)选择属于不同表的列,因此生成的__rows__不是特定类型。因此LINQ即时创建一个新类型。 – dotNET 2013-04-04 11:09:46

回答

1

就像SQL一样,LINQ也支持JOIN。你可以阅读更多关于他们的语法here。您应该相应地更改您的查询以获得您的结果。我没有提供确切的答案,而是指导你更详细的解释,因为它包含有价值的信息,这些信息将在未来帮助你。

+0

谢谢你,但是,我如何选择 - 只有几列,而不是选择所有列?我试图像在SQL中那样做,但它不起作用,而是提示错误。 – Edwin 2013-04-04 07:50:00

+1

请参阅http://msdn.microsoft.com/en-us/library/vstudio/bb397941.aspx。在JOIN的情况下,您通常需要从多个表(实体)中选择列,因此返回的对象通常是匿名类型的,比如您在上面发布在EDIT部分的示例。但是,如果这种类型的对象在你的代码中被过度使用,你可能想为它创建一个结构或类。然后你的查询会稍微修改一下,即不用'select new {sa.SaleID ...',你可以选择new YourClass {sa.SaleID ...'。希望有所帮助。 – dotNET 2013-04-04 11:01:45

+0

我明白了。谢谢你的提示! – Edwin 2013-04-05 02:06:46