2012-01-24 10 views
1

プロジェクトでは、LINQ to SQLクラスがOrderingSystem.dbmlです。私は次のコードを持っているとselect文では、各テーブル(製品 - カテゴリ)からいくつかの行のみを取得したい。しかし、もちろん私が今持っているリターンステートメントは正しくありません。正しいreturn文は何ですか?選択新しいオン事前に感謝LINQ to SQL return文


    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句では、2番目の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 Product { Name = p.ProductName, Price = p.ProductPrice, Description = p.ProductDescription, Category = c.CategoryName }; 

EDIT:

はただでそれを交換してみてください:

select p; 
+0

プロジェクトのビルド中にエラーは発生しませんが、wcfサービスを呼び出そうとすると、次のように表示されます。クエリーでエンティティタイプ 'OrderingSystemWebServices.Product'を明示的に構築できません。 –

0

それが原因である

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

このようなものにLINQ式、 select new { }は匿名オブジェクトを作成し、メソッドはProductのListを返します。 ステートメントを変更してselect new Product() { ProductName = p.ProductName, ...に、それ以外はProductクラスの構造に応じて変更する必要があります。

0

「新しいLINQの選択」操作を使用すると、匿名型が作成されます。オブジェクトの作成の現在のスコープ内でその匿名型のプロパティにアクセスできますが、認識できない種類の匿名型は返すことができません。

  1. は、新しいクラス(例えば製品)を作成し、(他の回答が指示通り)SELECT文の一部として、その型のインスタンスを作成
  2. 戻りList<object>としてコレクション:2つのオプションがあります。これを行うと、オブジェクトから値を取得することはできますが、リフレクションによって値を取得する必要があります。これは、データ・バインディング・シナリオでデータ・ソースとしてコレクションを使用している場合には非常に有効です。