我遇到的情况是需要从两个数据库访问数据,如下所示:
TableA(ID,Name,tableB_ID,TableC_ID),TableC(ID,Name)存在于X db中,tableB(ID,Name)存在于Y数据库中。
我从tableA获得记录,我需要使用tableB的Name字段更改TableA记录的名称字段。
我正在通过获取记录来替换它:
List<Int> IDs=new List<int>(){1,2,3,4,5,6,7,8};
IQueryable<TableA> resultA=Xcontext.TableAs.where(t=>IDs.Contains(t.ID));
Dictionary<int,string> resultB = YContext.TableB.Where(t=>resultA.Select(a=>a.tableB_ID).Contains(t.ID));
将名称字段更改为
resultA.ToList().ForEach(a=>a.Name=resultB.FirstORDefault(r=>r.ID==a.tableB_ID))
我需要resultA作为可查询因此我可以使用Association来访问listView中的数据
<% Eval("TableC.Name")%>
我是否遵循正确的approch? Plz建议我任何其他方式,如果有的话可以更好。
答案 0 :(得分:0)
假设您在提取resultB
(YContext
)时遇到问题,因为您使用来自不同数据库上下文(Queryable
)的XContext
:
resultB = YContext.TableB.Where(t=>resultA.Select(a=>a.tableB_ID).Contains(t.ID));
据我所知,一些Linq驱动程序无法轻易评估包含来自不同上下文的表达式的IQueryable
。所以在你的情况下,首先应该从第一个上下文(resultA
)获取结果,然后将其传递给第二个上下文:
List<Int> IDs=new List<int>(){1,2,3,4,5,6,7,8};
IList<TableA> resultA=Xcontext.TableAs.Where(t=>IDs.Contains(t.ID)).ToList(); //here you call ToList() that fetches the records to .net collection
//also some linq drivers are unable to parse complex expressions like Select(), so its better to move the IDs to a separate collection
var tableBIDs = resultA.Select(a=>a.tableB_ID).ToList();
var resultB = YContext.TableB.Where(t=>tableBIDs.Contains(t.ID));