LINQ "Метод соединения не поддерживается" пропал, когда поставлено "AsEnumerable"

У меня есть WCF, который запрашивает данные из объектов данных. Я немного сбиваюсь с толку, почему он жаловался на "метод соединения не поддерживается", если в синтаксисе не указано "AsEnumerable", и есть способ не использовать AsEnumerable. Поскольку я прочитал некоторую упомянутую статью, он поместит все данные перед выполнением условия "где".

        Dim ent As DataEnties.DPPromoterEntities
        Dim que = Nothing
        Dim sRet As String = ""

        Try
            ent = New DataEnties.DPPromoterEntities(New Uri(AppSettings.Item("Data")))

            que = From CHS In ent.RC_CampaignHubSpokeTbl.AsEnumerable  '<--This line 
                  Join Cam In ent.RC_CampaignTbl.AsEnumerable On Cam.intCampaign Equals CHS.intCampaign'<--This line 
                  Where Cam.tintStatus.Equals(1)
                  Select New With {CHS.intCampaign,
                                   CHS.intCouponRefHub,
                                   CHS.intCouponRefSpoke,
                                   CHS.intHubRef,
                                   CHS.intSpokeRef}
            sRet = New JavaScriptSerializer().Serialize(que)

        Catch ex As Exception
            clsLog4Net.WriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name.ToString, ex.Message, True)
        End Try

1 ответ

Решение

AsEnumerable заставить Join выполнение оператора в LINQ to Objects. Так что все данные из RC_CampaignHubSpokeTbl а также RC_CampaignTbl будут взяты из WCF, а затем объединены вместе в вашем приложении.

Это необходимо, потому что вызовы WCF не поддерживают соединения.

Чтобы немного оптимизировать свой запрос, вы можете сделать следующее:

que = From CHS In ent.RC_CampaignHubSpokeTbl.AsEnumerable()
      Join Cam In ent.RC_CampaignTbl.Where(Function(c) c.tintStatus.Equals(1)).AsEnumerable() On Cam.intCampaign Equals CHS.intCampaign
      Select New With {CHS.intCampaign,
                       CHS.intCouponRefHub,
                       CHS.intCouponRefSpoke,
                       CHS.intHubRef,
                       CHS.intSpokeRef}

Дальнейшая возможная оптимизация - не уверен Contains() доступно в вызовах WCF, поэтому вы должны проверить это самостоятельно.

Dim compains = ent.RC_CampaignTbl.Where(Function(c) c.tintStatus.Equals(1)).ToArray()
Dim HubSpokes = ent.RC_CampaignHubSpokeTbl.Where(Function(h) compains.Contains(h.intCampaign)).ToArray()

que = From CHS In compains 
      Join Cam In HubSpokes  On Cam.intCampaign Equals CHS.intCampaign
      Select New With {CHS.intCampaign,
                       CHS.intCouponRefHub,
                       CHS.intCouponRefSpoke,
                       CHS.intHubRef,
                       CHS.intSpokeRef}
Другие вопросы по тегам