模拟跨上下文连接 - LINQ / C# [英] Simulating Cross Context Joins--LINQ/C#
问题描述
下面的问题:
我有2个数据的上下文,我愿做一个连接上。现在我知道,LINQ不允许从一个环境到另一个连接,我知道2个可能的解决办法是要么建立一个单一的DataContext或有2个独立的查询(这是我在做什么现在)。不过,我想要做的就是模拟的联接。
下面是我已经试过。
使用(VAR _baseDataContext =实例)
{
VAR查询从A =在_baseDataContext.Account.ACCOUNTs
其中,a.STR_ACCOUNT_NUMBER.ToString()==帐户ID
加入应用在_baseDataContext.Account.APPLICATIONs上a.GUID_ACCOUNT_ID等于
app.GUID_ACCOUNT
加入l在GetLoans()上app.GUID_APPLICATION等于l.GUID_APPLICATION
选择l.GUID_LOAN; 返回query.Count()> 0? query.First():Guid.Empty;
}私有静态的IQueryable<借贷和GT; GetLoans()
{
使用(VAR _baseDataContext =实例)
{
返回(从升的_baseDataContext.Loan.LOANs
选择L).AsQueryable();
}
}
在运行时,我得到的是
System.InvalidOperationException:该查询包含对不同数据上下文定义的项目引用
编辑:
工作方案:
使用(VAR _baseDataContext =实例)
{
VAR查询从A =在_baseDataContext.Account.ACCOUNTs
其中,a.STR_ACCOUNT_NUMBER.ToString()==帐户ID
加入应用在_baseDataContext.Account.APPLICATIONs上a.GUID_ACCOUNT_ID等于
app.GUID_ACCOUNT
加入l在GetLoans()上app.GUID_APPLICATION等于l.GUID_APPLICATION
选择l.GUID_LOAN; 返回(query.Count()&0)? query.First():Guid.Empty;
}私有静态的IEnumerable<借贷和GT; GetLoans()
{
使用(VAR _baseDataContext =实例)
{
返回(从升的_baseDataContext.Loan.LOANs
选择L).AsQueryable();
}
}
也许这样的事情可以让你在正确的方向开始。我做了基于列名类似列模拟数据库,并得到了一定的成效。
类节目
{
静态AccountContextDataContext aContext =新AccountContextDataContext(@数据源=;初始目录=;集成安全性=真);
静态LoanContextDataContext lContext =新LoanContextDataContext(@数据源=;初始目录=;集成安全性=真); 静态无效的主要()
{ VAR查询从A =在aContext.ACCOUNTs
加入应用在aContext.APPLICATIONs上a.GUID_ACCOUNT_ID等于app.GUID_ACCOUNT
其中,app.GUID_APPLICATION.ToString()==24551D72-D4C2-428B-84BA-5837A25D8CF6
选择GetLoans(app.GUID_APPLICATION); IEnumerable的<借贷和GT;贷款= query.First();
的foreach(贷款贷款枚举)
{
Console.WriteLine(enumerable.GUID_LOAN);
} 到Console.ReadLine();
} 私有静态的IEnumerable<借贷和GT; GetLoans(GUID applicationGuid)
{
返回(从升的lContext.LOANs那里l.GUID_APPLICATION == applicationGuid选择L).AsQueryable();
}
}
希望这有助于!
Here's the issue:
I have 2 data contexts that I would like to do a join on. Now I know that LINQ doesn't allow joins from one context to another, and I know that 2 possible solutions would be to either create a single datacontext or to have 2 seperate queries (which is what I'm doing for now). However what I would like to do is to "simulate" a join.
Here's what I've tried.
using (var _baseDataContext = Instance)
{
var query = from a in _baseDataContext.Account.ACCOUNTs
where a.STR_ACCOUNT_NUMBER.ToString() == accountID
join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals
app.GUID_ACCOUNT
join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION
select l.GUID_LOAN;
return query.Count() > 0 ? query.First() : Guid.Empty;
}
private static IQueryable<LOAN> GetLoans()
{
using (var _baseDataContext = Instance)
{
return (from l in _baseDataContext.Loan.LOANs
select l).AsQueryable();
}
}
In run time I get is
System.InvalidOperationException: The query contains references to items defined on a different data context
EDIT:
Working Solution:
using (var _baseDataContext = Instance)
{
var query = from a in _baseDataContext.Account.ACCOUNTs
where a.STR_ACCOUNT_NUMBER.ToString() == accountID
join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals
app.GUID_ACCOUNT
join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION
select l.GUID_LOAN;
return (query.Count() > 0) ? query.First() : Guid.Empty;
}
private static IEnumerable<LOAN> GetLoans()
{
using (var _baseDataContext = Instance)
{
return (from l in _baseDataContext.Loan.LOANs
select l).AsQueryable();
}
}
Maybe something like this can get you started in the right direction. I made a mock database with similar columns based on your column names and got some results.
class Program
{
static AccountContextDataContext aContext = new AccountContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True");
static LoanContextDataContext lContext = new LoanContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True");
static void Main()
{
var query = from a in aContext.ACCOUNTs
join app in aContext.APPLICATIONs on a.GUID_ACCOUNT_ID equals app.GUID_ACCOUNT
where app.GUID_APPLICATION.ToString() == "24551D72-D4C2-428B-84BA-5837A25D8CF6"
select GetLoans(app.GUID_APPLICATION);
IEnumerable<LOAN> loan = query.First();
foreach (LOAN enumerable in loan)
{
Console.WriteLine(enumerable.GUID_LOAN);
}
Console.ReadLine();
}
private static IEnumerable<LOAN> GetLoans(Guid applicationGuid)
{
return (from l in lContext.LOANs where l.GUID_APPLICATION == applicationGuid select l).AsQueryable();
}
}
Hope this helps!
这篇关于模拟跨上下文连接 - LINQ / C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!