2016-10-07 4 views
0

MVCでWeb APIを作成しています。データベースは(これまでのところ)シンプルで、3つのテーブルしかありません。私は彼らに参加することはできません。である、私は、コントローラ内のテーブルを結合するための3つの異なる方法を試してみた、すべてが同じエラーを返す:'Systems.Collections.Generic.IEnumerables <>'を修正する方法説明変換が存在します。あなたはキャストを逃していますか?

秘密のタイプ(何か*)することはできません 「はSystems.Collections.Generic.IEnumerables < SalesDbApiに。 Sample> ' Explicit変換が存在します。あなたはキャストを逃していますか?

は(*「何か」の部分はは、参加方法に応じて異なる場合に発生しますが、メッセージの残りの部分は同じままなので、私はそれが関連する部分であると仮定しています。)

私は推測しています

{"SampleId":10,"Barcode":"863760","CreatedAt":"2016-01-25T00:00:00","CreatedBy":10,"StatusID":3,"User":null,"Status":null} 

ユーザーとステータス上がらない:私はしていない場合は参加して、ちょうどすべて私が戻って、次のJSONを取得するサンプルから選択を行うにはので、私は、セットアップのLINQの私のエンティティの関係を、持っているかと間違って何かがありますSampleテーブルのフィールドに入力します。彼らは私がリンクしようとしているテーブルの名前なので、それらが出現するとは思わないでしょう。

私が間違っていたことはありますか?ここでは、コントローラからのコードですStatuses.cs

namespace SalesDbApi 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Status 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public Status() 
     { 
      this.Samples = new HashSet<Sample>(); 
     } 

     public int StatusId { get; set; } 
     public string Status1 { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Sample> Samples { get; set; } 
    } 
} 

Samples.cs

namespace SalesDbApi 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Sample 
    { 
     public int SampleId { get; set; } 
     public string Barcode { get; set; } 
     public Nullable<System.DateTime> CreatedAt { get; set; } 
     public int CreatedBy { get; set; } 
     public int StatusID { get; set; } 

     public virtual User User { get; set; } 
     public virtual Status Status { get; set; } 
    } 
} 

Users.cs

namespace SalesDbApi 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class User 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public User() 
     { 
      this.Samples = new HashSet<Sample>(); 
     } 

     public int UserId { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Sample> Samples { get; set; } 
    } 
} 

:ここ

は私の3つのモデルです

SalesUsersController.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using SalesDbApi; 

namespace SalesProject.Controllers 
{ 
    public class SalesUsersController : ApiController 
    { 
     webapitestdbEntities1 db = new webapitestdbEntities1(); 

     public IEnumerable<Sample> Get() 
     { 

      { 
       db.Configuration.ProxyCreationEnabled = false; 

       var query = from x in db.Samples 
          join q in db.Users 
          on x.CreatedBy equals q.UserId 
          select q.FirstName; 
       return query.ToList(); 
      } 
     } 
+0

あなたの質問は、 'Sample'ではなく' User'の 'FirstName'プロパティだけを選択しています。なぜ' join'が必要なのかは不明ですが、 'select x'(' select q.FirstName'ではなく) 'Sample'のコレクションを返すだけの場合は' User'の他のプロパティを返す場合は、それらのプロパティを含むビューモデルに結果を投影する必要があります。 –

+0

私はいくつかのフィールドを選択しようとしましたが、結合されたテーブルから引っ張られているので、一見同じようにエラーが発生しました。 xを選択しようとすると、上記の結果({"SampleId":10、 "Barcode": "123"、 "CreatedAt": "2016-01-25T00:00:00"、 "CreatedBy":10、これらのフィールドのすべては、ユーザーとステータスを除いてサンプル・テーブルから取得されます。ユーザーおよびステータスは、どの表のフィールドでもありません。それらは、sample.csモデルのパブリック仮想クラスとして設定された他のテーブルへの参照です。 public virtual User User {get;セット; } public virtualステータスステータス{get;セット; } – David

+0

私の最初のコメントをもう一度読んでください。複数のテーブルのフィールドが必要な場合は、 'Sample'のコレクションを返すことはできません - 必要なプロパティを含むモデルのコレクションを返す必要があります - '新しいMyModel {SampleId = x .SampleId、FirstName = q.FirstName、.....} ' –

答えて

0

は、私は、データベース内のデータではなく、テーブルのサンプルやテーブルのユーザーを考えます。 linqはデータのないテーブルに対応できないためです。

+0

どちらもそこにあります。 1つのテーブルからコントローラを介してデータを返そうとすると、それが返されます。エラーは、テーブルを結合しようとすると発生します。 – David

+0

多分、ジョインテーブルはデータリレーションではなく、最終的にジョインはデータが見つかりません。 SQLクエリで手動で結合しようとすると、データがあるかどうか –

+0

ええ、手動の結合でも私に同じエラーが出ました。私がMVCでWebアプリケーションをやっていたときは、以前は私のために働いていました。私がこのようにWeb APIを作成したのはこれが初めてのことなので、2つの間に違いがあるのだろうかと思っています。 – David

関連する問題