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}