首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模拟跨上下文连接--LINQ/C#

模拟跨上下文连接--LINQ/C#
EN

Stack Overflow用户
提问于 2009-05-22 15:06:03
回答 3查看 32.2K关注 0票数 24

这是问题所在:

我有两个数据上下文,我想对它们进行连接。现在我知道LINQ不允许从一个上下文连接到另一个上下文,我知道有两种可能的解决方案,要么创建一个单独的数据上下文,要么有两个独立的查询(这就是我现在正在做的)。然而,我想要做的是“模拟”一个连接。

这是我尝试过的方法。

代码语言:javascript
复制
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();
    }
}

在运行时,我得到的是

System.InvalidOperationException:查询包含对在不同数据上下文中定义的项的引用

编辑:

工作解决方案:

代码语言:javascript
复制
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();
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-22 15:40:06

也许像这样的事情可以让你开始朝着正确的方向前进。我根据你的列名做了一个相似列的模拟数据库,并得到了一些结果。

代码语言:javascript
复制
    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();
    }
}

希望这能有所帮助!

票数 16
EN

Stack Overflow用户

发布于 2009-05-22 16:23:47

这就是我们找到的“变通办法”...

我们从另一个数据库手动构建表,如果它在同一台服务器上,那么我们在表名前加上前缀:

代码语言:javascript
复制
<DatabaseName>.<SchemaName>.<YourTableName>

如果它们位于链接服务器上,则还必须为其添加服务器名称前缀:

代码语言:javascript
复制
<ServerName>.<DatabaseName>.<SchemaName>.<YourTableName>

这将允许您进行连接,并仍然返回未执行的IQueryable...这就是我们想要的。中的其他两种方法涉及连接内存中的IEnumerables,这意味着您在执行连接(如上所述)之前提取每个记录的所有记录,并使用包含方法进行IQueryable连接,这是有限制的……

希望在未来,DataContext能够构建得足够智能,以便知道如果服务器是链接的,那么您可以在两个不同的服务器之间进行连接。

票数 3
EN

Stack Overflow用户

发布于 2009-05-22 15:27:24

我倾向于创建一个单独的数据上下文,它只包含您想要连接的两个表。但我认为您可以在第二个上下文中维护一个临时表(包含第一个上下文中的数据),然后连接临时表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/898363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档