模拟跨上下文连接 - LINQ / C# [英] Simulating Cross Context Joins--LINQ/C#

查看:192
本文介绍了模拟跨上下文连接 - 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆