从linq中的两个数据库访问数据的最佳方法

时间:2014-08-06 09:33:13

标签: c# linq

我遇到的情况是需要从两个数据库访问数据,如下所示:

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建议我任何其他方式,如果有的话可以更好。

1 个答案:

答案 0 :(得分:0)

假设您在提取resultBYContext)时遇到问题,因为您使用来自不同数据库上下文(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));
相关问题