如果我理解正确,您的数据源只有一个自定义 LINQ 提供程序,并且还有一种(可能是类型安全的)获取缓存结果的方式。
在这种情况下,我建议只使用 LINQ to Objects 来访问您的缓存集。您可以使用 AsEnumerable 将自定义 LINQ 提供程序“跳出”到 LINQ to Objects。
不过,join 带来了一个问题。由于这两种类型中的任何一种都可能存在于缓存中,因此无法将逻辑推送到数据库。例如,是否有可能在缓存中有一个AccountTransaction 而它的Account 也不在缓存中?
如果您允许缓存中的任何情况(例如,AccountTransaction 没有关联的Account 记录),那么您必须在内存中而不是在数据库中进行连接:
var allDebitAccountTransactions = Session.GetAllCached<AccountTransaction>()
.Where(x => x.DebitAmount >= 0)
.Union(Session.CreateLinq<AccountTransaction>()
.Where(x => x.DebitAmount >= 0));
var allAccounts = Session.GetAllCached<Account>()
.Union(Session.CreateLinq<Account>());
var query3 = from c in allDebitAccountTransactions
join a in allAccounts where c.Account equals a
select new { a.Name, c.DebitAmount };
但是,如果您对缓存有更多控制权,并且仅在存在关联的Account 对象时才允许存在AccountTransaction 对象,那么您可以将join 操作推送到数据源并执行另一个操作在内存中,合并结果:
var datasourceResults = from c in Session.CreateLinq<AccountTransaction>()
join a in Session.CreateLinq<Account>() on c.Account equals a
where c.DebitAmount >= 0
select new { a.Name, c.DebitAmount, c.Id };
var cacheResults = from c in Session.GetAllCached<AccountTransaction>()
join a in Session.GetAllCached<Account>() on c.Account equals a
where c.DebitAmount >= 0
select new { a.Name, c.DebitAmount, c.Id };
var query3 = cacheResults.Union(datasourceResults)
.Select(x => new { x.Name, x.DebitAmount });
我想。我不是 LINQ 方面的专家,所以我很想看看其他回复。