最初我使用了LINQ-to-SQL编写了这个查询
var result = from w in PatternDataContext.Windows
join cf in PatternDataContext.ControlFocus on w.WindowId equals cf.WindowId
join p in PatternDataContext.Patterns on cf.CFId equals p.CFId
join r in ResultDataContext.Results on p.PatternId equals r.PatternId
join fi in ResultDataContext.IclFileInfos on r.IclFileId equals fi.IclFileId
join sp in sessionProfileDataContext.ServerProfiles on fi.ServerProfileId equals sp.ProfileId
join u in infrastructure.Users on sp.UserId equals u.Id
where w.Process.Equals(processName)
select u.DistributedAppId;
当我执行代码并在QuickWatch..中查看result
时,提示出现以下信息:
查询包含对另一个数据上下文中定义的项的引用
通过Google搜索,我在Stackoverflow上找到了这篇文章,学习了如何模拟跨上下文连接。根据该文章的建议,我对查询进行了一些更改,如下:
var result = from w in PatternDataContext.Windows
join cf in PatternDataContext.ControlFocus on w.WindowId equals cf.WindowId
join p in PatternDataContext.Patterns on cf.CFId equals p.CFId
join r in SimulateJoinResults() on p.PatternId equals r.PatternId
join fi in SimulateJoinIclFileInfos() on r.IclFileId equals fi.IclFileId
join sp in SimulateJoinServerProfiles() on fi.ServerProfileId equals sp.ProfileId
join u in SimulateJoinUsers() on sp.UserId equals u.Id
where w.Process.Equals(processName)
select u.DistributedAppId;
这个查询正在使用这些SimulateXyz方法:
private static IQueryable<Result> SimulateJoinResults()
{
return from r in SessionDataProvider.Instance.ResultDataContext.Results select r;
}
private static IQueryable<IclFileInfo> SimulateJoinIclFileInfos()
{
return from f in SessionDataProvider.Instance.ResultDataContext.IclFileInfos select f;
}
private static IQueryable<ServerProfile> SimulateJoinServerProfiles()
{
return from sp in sessionProfileDataContext.ServerProfiles select sp;
}
private static IQueryable<User> SimulateJoinUsers()
{
return from u in infrastructureDataContext.Users select u;
}
但即使采用这种方法,问题仍未解决。在 QuickWatch... 中我仍然会收到以下消息:
查询包含对在不同数据上下文中定义的项的引用
有没有解决此问题的方案?除了解决方案外,我还想知道为什么问题仍然存在,以及新解决方案如何精确地消除它,以便下次我可以自己解决这类问题。顺便说一句,我对 LINQ 还不太熟悉。