2012-01-24 133 views
1

在一個項目中,我有一個LINQ to SQL類,它是OrderingSystem.dbml。我有以下代碼,並且在select語句中,我只想從每個表中檢索一些行(產品 - 類別)。但是,當然,我現在的迴歸聲明是不正確的。什麼是正確的返回語句使用?在此先感謝LINQ to SQL返回語句


    OrderingSystemDataContext database = new OrderingSystemDataContext(); 

    public List<Product> GetProductsByCategoryID(int CategoryID) 
    { 
     var result = from p in database.Products 
     join c in database.Categories 
     on p.CategoryID equals c.CategoryID 
     where p.CategoryID == CategoryID 
     select new { p.ProductName, p.ProductPrice, p.ProductDescription, c.CategoryName }; 

     //This is not working 
     return result.ToList(); 
    } 
+1

你是不是指什麼意思? –

+0

@ DanielA.White從Visual Studio的確切錯誤是「不能隱式轉換類型'System.Collections.Generic.List '到'System.Collections.Generic.List '」 –

+0

您是否甚至需要一個where子句給你加入這些相同的列?同樣在where子句中,第二個CategoryID看起來不明確。 – radarbob

回答

1

在選擇新的,你必須指定類型,如果你再要檢索的產品清單,現在它創建一個匿名類型。嘗試更改:

OrderingSystemDataContext database = new OrderingSystemDataContext(); 

public List<Product> GetProductsByCategoryID(int CategoryID) 
{ 
    var result = from p in database.Products 
    join c in database.Categories 
    on p.CategoryID equals c.CategoryID 
    where p.CategoryID == CategoryID 
    //Assuming that these are the names of your properties 
    select new Product(){ProductName = p.ProductName, ProductPrice = p.ProductPrice, ProductDescription = p.ProductDescription, CategoryName = c.CategoryName }; 

    return result.ToList(); 
} 
+0

我在構建項目時沒有收到任何錯誤,但是當我嘗試調用wcf服務時,它會這樣說:不允許在查詢中顯式構造實體類型'OrderingSystemWebServices.Product'。 –

0

您的返回類型是Product,但您的查詢結果使用匿名類型。

改變這一行:

select new { p.ProductName, p.ProductPrice, p.ProductDescription, c.CategoryName }; 

到這樣的事情:

select new Product { Name = p.ProductName, Price = p.ProductPrice, Description = p.ProductDescription, Category = c.CategoryName }; 

編輯:

select p; 
+0

我在構建項目時沒有收到任何錯誤,但是當我嘗試調用wcf服務時,它會這樣說:不允許在查詢中顯式構造實體類型'OrderingSystemWebServices.Product'。 –

0

這是因爲:

儘量只用替換它LINQ表達式,你做了一個select new { }它創建一個匿名對象,而你的方法返回一個列表Product。您應該更改select語句,使其成爲select new Product() { ProductName = p.ProductName, ...其餘部分取決於Product類的結構。

0

通過使用「選擇新的」LINQ操作,您正在創建一個匿名類型。您可以在對象創建的當前範圍內訪問該匿名類型的屬性,但不能使用任何可識別的類型返回該匿名類型。你有兩個選擇:

  1. 創建一個新類(例如產品),並創建該類型的實例爲您的select語句的一部分(如其他答案指示)
  2. 返回集合爲List<object>。如果你這樣做,你仍然可以從對象中檢索值,但是你需要通過反射來完成。如果您將集合用作數據綁定場景中的數據源,這可能非常有效。