2009-12-21 28 views
0

我正从我的BusinessLogic方法返回List,其中Type是由Linq2Sql类生成的类之一。现在,如果我使用连接语句并从不同表中获取包含属性(列)的结果,那么我的返回对象应该是一个列表<>什么?当使用JOIN时从LINQ到SQL类返回什么类

我使用Telerik的asp.net ajax组件,并将RadGrid的数据源设置为List。

我是使用linq2sql类的新手。提前致谢。

回答

0

您可以创建其中有你想要的属性一个新的类,然后当你做。选择

List<MyClass> list = ... .Select(d => new MyClass() { Prop1 = d.P1...etc }).ToList() 

然后你就可以使用该列表绑定到你的管制

0

这是一个通用对象,所以你可以做(​​声明变量时):

List<object> obj = from u in db.Users ... 
// or 
var obj = from u in db.Users ... 
+0

您*可以*使用var(或对象),但是在输出时无法强制键入对象 – Paul 2009-12-21 14:37:26

+0

@IP:该变量仍然是强类型的。 'var'关键字只告诉编译器推断表达式的返回类型。但在这种情况下'obj'仍然是强类型的。 – 2009-12-21 15:16:32

0

这将是匿名类型的List。我将创建一个具有包含您要加入的表对象的属性的类,然后返回这些类的List

0

您可以创建一个只包含组件所需的属性的特定模型类,或者更好的方法是使用匿名类。

radGrid.DataSource = joinQuery.Select(j => new { j.Name, j.Price, j.Quantity, .. }); 
+0

使用匿名类型意味着当您将该对象输出到页面时,该对象不能被强制键入。我猜如果这不是必需的,那么var就没事了,但这意味着使用Eval(“P1”)......这不是那么好 – Paul 2009-12-21 14:39:47

2

您可以返回一个匿名对象:

select x from db.Table1 
join y in db.Table2 
where x.Table2Id equals y.Table2Id 
select new 
{ 
    Value1 = x.Value1, 
    Value2 = y.Value2 
}; 

或者推出自己的实体类:

class JoinedTableEntity 
{ 
    public string Value1 { get; set; } 
    public string Value2 { get; set; } 
} 

select x from db.Table1 
join y in db.Table2 
where x.Table2Id equals y.Table2Id 
select new JoinedTableEntity 
{ 
    Value1 = x.Value1, 
    Value2 = y.Value2 
}; 

第二种解决方案是更容易,如果你传递有用数据超出了查询方法的范围,因为识别匿名对象很困难,而且如果没有反射,您将无法访问其属性。

如果您只是将数据传递给网格或使用反射来显示数据的东西,那么匿名对象就足够了。

+0

所以我将基本上为每个网格屏幕有一个类。我会有很多像ThisSearchResult ThatSearcResult类的类... – Emre 2009-12-21 14:40:37

+0

如果你只是将数据stright放入一个网格中,那么一个可怕的类可能会好起来:因为网格使用反射来获取数据,所以它不那么重要它有一个强烈定义的类型。但是,如果您还在操作代码中的数据,您可能会发现显式声明的类更易于操作。 – Grokys 2009-12-21 14:43:34

1

只需创建一个新的类模型来保存数据,因为它将是两个类的混合。

var exp = (

       from o in this.reposOrders.All() 
       join c in this.reposCustomers.All() on o.CustomerID equals c.CustomerID 
       where o.OrderID == id 
       select new CustomerOrderItem() 
       { 
        OrderID= o.OrderID, 
        CustomerID = c.CustomerID, 
        ItemName = o.ItemName, 
        BillingAddress = c.BillingAddress 
       } 
      ).Single(); 
return exp; 




public class CustomerOrderItem(){ 
    public int OrderItem { get; set;} 
    public int CustomerID { get; set;} 
    public string ItemName { get; set;} 
    public string BillingAddress { get; set;} 
} 
0

还有,你需要知道在这种情况下三种不同的选择:

  • 考虑使用视图或存储过程。对于大集合,或者性能至关重要,这就是要走的路。导入视图或存储过程,您将获得一个新类型
  • 即时创建一个匿名类型。如果你需要一个带有已定义成员的平坦结果集,这就是要走的路。在你的查询中,使用新的{col1 = abc,col2 = cde,...}结构来创建一个。但是,有限制,因为您不能在方法之间传递匿名类型(类型信息在本地上下文之外不可用)。
  • 您并不需要返回连接的对象,因为如果使用外键约束,它可以通过主对象的成员进行访问。
相关问题