2009-12-21 25 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,...}結構來創建一個。但是,有限制,因爲您不能在方法之間傳遞匿名類型(類型信息在本地上下文之外不可用)。
  • 您並不需要返回連接的對象,因爲如果使用外鍵約束,它可以通過主對象的成員進行訪問。
相關問題