2010-03-31 37 views
0

當談到linq時,我通常對返回類型有困難。我會通過下面的例子來解釋。比方說,我有一個表產品與產品ID,姓名,類別和價格爲列:如何在使用Linq2Sql的方法中確定返回類型?

1)IQueryable的< ***產品*> **

public IQueryable<Product> GetChildrenProducts() 
{ 
    return (from pd in db.Products 
      where pd.Category == "Children" 
      select pd); 
} 

2)產品

public Product GetProduct(int id) 
{ 
    return (from pd in db.Products 
      where pd.ProductID == id 
      select pd).FirstOrDefault(); 
} 

現在,如果我決定選擇,例如,只有一列(價格或名稱),或者甚至是2個或3列(名稱和價格) ,但無論如何,少於4列,返回類型是什麼?

我的意思是這樣的:

public returnType GetSomeInformation() 
{ 
return (from pd in db.Products 
     select new { pd.Name, pd.Price } 
} 

應該是什麼的GetSomeInformation()返回類型

感謝您的幫助

回答

2

你不能在這種情況下使用var,因爲類型目前只能在本地推斷變量。

因此,要麼:

移動Select()部分給調用者,並返回一個普通的IQueryable<Product>

public IQueryable<Product> GetSomeInformation() 
{ 
    return (from pd in db.Products 
      select pd); 
} 

var information = GetProductInformation().Select(p => new { p.Name, p.Price }); 

創建的返回類型ProductInformation只包含您需要的信息:

class ProductInformation 
{ 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

public IQueryable<ProductInformation> GetSomeInformation() 
{ 
    return (from pd in db.Products 
      select new ProductInformation { Name=pd.Name, Price=pd.Price }); 
} 
+0

@Yannick M. - 如果我決定查詢產品ID和類別(而不是名稱和價格),是否需要創建包含2列的其他類? – Richard77 2010-03-31 18:13:40

+0

如果您願意,您可以讓您的課程包含全部四個字段,並且只設置需要使用的字段(如果需要)。或者,您可以根據每個LINQ請求返回的字段創建多個類。 – 2010-03-31 19:08:41

+0

我更喜歡第一個選項,即只有一個類並設置我想要的字段。如果這是真的,(i)我可以在上面的例子中使用Product而不是ProductInformation? (ii0如果我可以使用Product而不是ProductInformation,那麼是否需要'Name = pd.Name'來代替'Name'? – Richard77 2010-03-31 20:28:53

0

簡答題:IEnumerable

龍答:

什麼你是返回是anonymous type的集合,因此需要返回類型爲IEnumerable

+0

你會如何建議去到無類型匿名類型的屬性值? (不要說反射;-) – 2010-03-31 14:23:40

+0

這是一件事我簡單** **在C#中缺乏動態成員解析。 VB.NET自.NET 1.0起就有這個功能。它是iicsome。現在每個人都在談論*動態*就像是第二次到來。 Geez ......它已經存在很久了。 – 2010-03-31 14:43:08

+0

Tbh,我看到DLR的實施只是爲了達到目的。這使我能夠減少惱人的COM互操作,並呼籲動態語言資源。但我沒有看到自己使用'dynamic'關鍵字。 – 2010-03-31 14:49:18

2

如果您選擇多個列,但不是全部對象,LINQ將返回一個通用對象。如果你想通過函數返回的數據的子集,你需要創建自己的類並加載它是這樣的:

public class MyObject 
{ 
    public string Name { get; set; } 
    public double Price { get; set; } 
} 

public MyObject GetSomeInformation() 
{ 
return (from pd in db.Products 
     select new MyObject { 
      Name = pd.Name, 
      Price = pd.Price 
     }).FirstOrDefault(); 
} 
+0

@Charles Boyung - 如果我決定只查詢一列(例如,選擇pd.name),那麼該如何?我是否需要創建一個屬性類?或者我可以使用簡單的類型,比如string,int,bool等? – Richard77 2010-03-31 18:06:30

+0

是的,如果你只是想要一個列,那麼你可以使用任何.net類型的列。如果您不確定,那麼該列中的VS智能感知會在您編寫代碼時告訴您該類型。 – 2010-03-31 19:07:25

相關問題