2010-11-27 5 views
2

OKこれで、私はエラーが発生しているのを知っています。私はそれを修正する方法を知らない。基本的に、ユーザーに特定の権限がない場合は、別のテーブルに参加する必要があります。しかし、.NETはとても厄介です。私はIF文で2つの異なるクエリを作成し、if文の外でそれを使用することはできません。私はこのためにいくつかの醜い回避策を考えることができますが、私はむしろそうではありません。私はかなり.NETに慣れています。私は危険なほど十分に知っています。同じ変数のw/ifステートメントを使用して異なるLINQデータソースをバインドする

Private Sub loadLeads() 
     Using db As New CRMDataDataContext(SQLConnectionString) 
      Dim count = 0 
      Dim l As IEnumerable(Of Company) 
      If CanViewAllLeads(User.Identity.Name, db) = True Then 
       Dim q = From leads In db.Companies _ 
         Join s In db.CompanySources On s.CompanySourceID Equals leads.CompanySourceID _ 
         Where leads.Active = True And leads.CompanyStatusID = 1 _ 
         Select leads.CompanyID, _ 
           leads.BusinessName, _ 
           leads.Website, _ 
           leads.Phone, _ 
           leads.Fax, _ 
           leads.LastContacted, _ 
           leads.FollowUp, _ 
           leads.CreatedBy, _ 
           leads.Created, _ 
           leads.UpdatedBy, _ 
           leads.Updated, _ 
           Source = s.Source 
       count = q.Count 
       l = q 
      Else 
       Dim q = From leads In db.Companies _ 
        Join s In db.CompanySources On s.CompanySourceID Equals leads.CompanySourceID _ 
        Join xref In db.UserCompaniesXrefs On leads.CompanyID Equals xref.CompanyID _ 
        Where leads.Active = True And leads.CompanyStatusID = 1 And xref.UserID = NCGuid(User.Identity.Name) _ 
        Select leads.CompanyID, _ 
          leads.BusinessName, _ 
          leads.Website, _ 
          leads.Phone, _ 
          leads.Fax, _ 
          leads.LastContacted, _ 
          leads.FollowUp, _ 
          leads.CreatedBy, _ 
          leads.Created, _ 
          leads.UpdatedBy, _ 
          leads.Updated, _ 
          Source = s.Source 
       count = q.Count 
       l = q 
      End If 
      If count > 0 Then 
       dgLeads.DataSource = l 
       dgLeads.DataBind() 
      Else 
       pnlLeads.Visible = False 
       pnlNoLeads.Visible = True 
      End If 
     End Using 
    End Sub 

私はエラーを取得する:型のオブジェクトをキャストすることができません「System.Data.Linq.DataQuery 1[VB$AnonymousType_1 11 [可能System.Guid、可能System.String、可能System.String、可能System.String、可能System.String、システム.Nullable 1[System.DateTime],System.Nullable 1 [System.DateTime]、System.Nullable 1[System.Guid],System.Nullable 1 [System.DateTime]、System.Nullable 1[System.Guid],System.Nullable 1 [System.DateTime]]] 'を入力してSystem.Collections.Generic.IEnumerable`1 [Ten11CRMLib.Company ] '。

このため、Dim lとしてIEnumerable(Of Company)はIEnumerableの会社ではなく、そのソースを取得しています。私は明示的に私のDataGridでそれを使用するソースを選択する必要があります。私はそれを不平を停止する何かを作ることはできますか?

答えて

2

Aliostadがqを単にバインドすると言ったとき、私はそれがうまくいかないことを知っていましたが、私は冗長であることを認識しました。私は明示的な選択と両方のクエリから同じものを選択していたので、*(これは私がIEnumerable(会社の)を持っていたときにやっていたものです)を選択するのではなく、単にif文の外でDim q IEnumerableをDimします。明示的にvs allを選択しても一般的なIEnumerableの作業に影響があるかどうかはわかりません。できた、

私は謝罪
Private Sub loadLeads() 
     Using db As New CRMDataDataContext(SQLConnectionString) 
      Dim q As IEnumerable 
      If CanViewAllLeads(User.Identity.Name, db) = True Then 
       q = From leads In db.Companies _ 
         Join s In db.CompanySources On s.CompanySourceID Equals leads.CompanySourceID _ 
         Where leads.Active = True And leads.CompanyStatusID = 1 _ 
         Select leads.CompanyID, _ 
           leads.BusinessName, _ 
           leads.Website, _ 
           leads.Phone, _ 
           leads.Fax, _ 
           leads.LastContacted, _ 
           leads.FollowUp, _ 
           leads.CreatedBy, _ 
           leads.Created, _ 
           leads.UpdatedBy, _ 
           leads.Updated, _ 
           Source = s.Source 
      Else 
       q = From leads In db.Companies _ 
        Join s In db.CompanySources On s.CompanySourceID Equals leads.CompanySourceID _ 
        Join xref In db.UserCompaniesXrefs On leads.CompanyID Equals xref.CompanyID _ 
        Where leads.Active = True And leads.CompanyStatusID = 1 And xref.UserID = NCGuid(User.Identity.Name) _ 
        Select leads.CompanyID, _ 
          leads.BusinessName, _ 
          leads.Website, _ 
          leads.Phone, _ 
          leads.Fax, _ 
          leads.LastContacted, _ 
          leads.FollowUp, _ 
          leads.CreatedBy, _ 
          leads.Created, _ 
          leads.UpdatedBy, _ 
          leads.Updated, _ 
          Source = s.Source 
     End If 
     If q.Cast(Of Company).Count > 0 Then 
      dgLeads.DataSource = q 
      dgLeads.DataBind() 
     Else 
      pnlLeads.Visible = False 
      pnlNoLeads.Visible = True 
     End If 
     End Using 
    End Sub 
2

カスタムクラス(匿名タイプ)を選択しています。これをCustomerオブジェクトにキャストすることはできません。

これを本当に行う必要がある場合は、コンバーターメソッドを作成するか、コンストラクターに渡してオブジェクトを渡し、匿名型の値を初期化します。オブジェクトのタイプとしての動的を使用してください。

+0

、再び私は.NETに新しいです:私はそれを行うにq.countを使用する能力を失ったが、あなたは以下の動作するコードに見ることができるように私はそのための別の解決策を見つけました私が必要としていることに関する資料や資料を私が提供してくれれば、あなたは私の頭の中に少し行きました。私はDim Iを匿名にして、それを私が必要とするものに投げ込む方法に送る必要があると言っていると思いますか? – KacieHouser

+0

なぜq自体をバインドしないのですか? qをlに割り当てず、qにバインドするだけで動作するはずです。あなたはASP.NET MVCを使用していますか? – Aliostad

+0

いいえ私は残念ながらMVCを使用していませんが、私はしたいと思っていますが、うーん、私は撃たれました。私はwebformsを使用しています。バインディングqは機能しません。したがって、if文で宣言されているため、qは宣言されていません。 .NETについての一つのことは本当に嫌いです。それはif/else、宣言されるGOING、qを使うだけでは構築できません。しかし、私は解決策を見つけ出しました。最初は明示的な選択をしていなかったので、私は必要なことを理解しました。私はすぐに答えを追加します。 – KacieHouser

関連する問題