2010-11-27 78 views
2

OK所以我知道为什么我遇到了错误。我不知道如何解决它。基本上,如果用户没有特定的权限,我需要加入另一个表。但是.NET非常挑剔,我不能在IF语句中做两个不同的查询,然后在if语句之外使用它。我可以为此想到一些丑陋的工作,但我宁愿不要。我对.NET相当陌生,我知道它足够危险。使用相同变量绑定不同的LINQ数据源w/if语句

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,它有它的源头。我必须明确地选择源在我的数据网格中使用它。我能让昏暗的东西让它停止抱怨吗?

回答

2

当Aliostad说刚刚绑定q,我知道这不会工作,但意识到我是多余的。因为我正在做明确的选择并从两个查询中选择相同的东西,而不是选择*(这正是我在做IEnumerable(公司)时所做的),我只是在if语句之外Dim q IEnumerable。我不确定是否显式选择vs all对泛型IEnumerable工作有任何影响。我失去了在做,要使用q.count的能力,但我发现对于不同的解决方案,你可以在下面工作的代码中看到:

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,能你为我需要做的事提供资源或文件,你有点过头了。我想你是说我必须让Dim l匿名,然后将它发送给一个方法,将它转换为我所需要的方式? – KacieHouser 2010-11-27 10:43:22

相关问题