如果我理解正确,您的数据源有一个自定义 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 };
但是,如果您对缓存有更多控制权,并且仅AccountTransaction
在存在关联Account
对象时才允许对象存在,那么您可以将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 方面的专家,所以我很想看到其他回复。