0

我有一个对象MyFriendFollowStatus,对于每个朋友,我需要来自 2 个不同数据库的信息,所以我写了这样的东西

db1Context FFdb = new db1Context();
db2Context EEdb = new db2Context();

foreach (fbFriendsFollowStatus a in fbids)
{
    long ffID = FFdb.FFUsers.Where(x => x.FacebookID == a.fbid).FirstOrDefault().FFUserID;
    a.ffID = ffID;
    int status = EEdb.StatusTable(x => x.ffID == ffid).FirstOrDefault().Status;
    a.Status = status;
}

这可行,但调用 2 个数据库似乎并不正确——每个用户一次,LinqToSql 中是否有内置的东西可以帮助解决这样的问题?或者我可以使用 2 个不同的数据库使用某种类型的连接?

4

1 回答 1

2

好吧,您始终可以将N+1查询问题限制为 3 个查询 - 一个用于获取用户,一个用于从第一个数据库获取用户数据,另一个用于第二个数据库。然后将所有结果连接到内存中——这将限制与数据库的连接,从而提高应用程序的性能。

我不知道是否linq-to-sqlentity framework提供来自不同数据库的构建模型——这可能会带来一些性能问题——比如包含或其他东西,但我可能根本不知道这些功能。

执行您要实现的目标的示例代码如下所示:

var facebookIds = fbFriendsFollowStatus.Select(a => a.fbid);
var FFUserIds= FFdb.FFUsers.Where(x => facebookIds.Contains(x.FacebookID)).Select(x => new { x.FacebookID, x.FFUserId)
var statuses = EEdb.StatusTable.Where(x => FFUserIds.Contains(x.ffID)).Select(x => new { x.ffID, x.Status})

然后是一些简单的代码来匹配内存中的结果——但这很简单。请注意,此代码是示例 - 如果我不匹配某些 id 或其他内容,但想法应该很清楚。

于 2013-04-21T20:38:43.727 回答