Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Telerik ORM连接来自不同上下文的两个表时会抛出错误_C#_.net_Linq_Orm_Telerik - Fatal编程技术网

C# 使用Telerik ORM连接来自不同上下文的两个表时会抛出错误

C# 使用Telerik ORM连接来自不同上下文的两个表时会抛出错误,c#,.net,linq,orm,telerik,C#,.net,Linq,Orm,Telerik,我试图在LINQ中使用连接来连接到不同上下文中的表。当我在同一个上下文中连接两个表时,它会工作,所以我相信我的连接是可以的,但是当我连接两个在不同上下文中的表时,我会得到一个错误。可以在来自不同上下文的两个表上进行连接吗 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RmmDal.Contexts.R

我试图在LINQ中使用连接来连接到不同上下文中的表。当我在同一个上下文中连接两个表时,它会工作,所以我相信我的连接是可以的,但是当我连接两个在不同上下文中的表时,我会得到一个错误。可以在来自不同上下文的两个表上进行连接吗

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RmmDal.Contexts.RmmCrm;
using RmmDal.Contexts.LMS;
using Telerik.OpenAccess;

namespace ConsoleApplication_Test_ORM
{
    class Program
    {
        static void Main(string[] args)
        {
            RmmDal.Contexts.RmmCrm.RmmCrmContext dbContextRmmCrm = new RmmDal.Contexts.RmmCrm.RmmCrmContext();
            RmmDal.Contexts.LMS.LMS_000Context dbContextLMS = new RmmDal.Contexts.LMS.LMS_000Context();

            try
            {
                Guid LeadId = new Guid("9EF2874C-D37F-4503-A3D8-1A73774BFBBC");

                //This doesn't work, I think because it is using 2 seperate Contexts
                //I need this to work
                var Leads1 = from lo in dbContextLMS.Tbl_Loan_Appls
                             join la in dbContextRmmCrm.LeadApplications
                             on lo.Appl_No equals la.Appl_No
                             select new
                             {
                                 SSN = lo.Cust_SSN,
                                 TDCCustID = lo.Cust_ID
                             };

                //This works, I think because they are the same context
                var Leads2 = from lo in dbContextLMS.Tbl_Loan_Appls
                             join la in dbContextLMS.Tbl_Customers
                             on lo.Cust_ID equals la.Cust_ID
                             select new
                             {
                                 SSN = lo.Cust_SSN,
                                 TDCCustID = lo.Cust_ID
                             };

                var something = Leads1.FirstOrDefault();

                var something2 = Leads1.FirstOrDefault();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
下面是引发的错误:

An exception occured during the execution of 'Extent<RmmDal.Tbl_Loan_Appl>().Join(Extent<RmmDal.Contexts.RmmCrm.LeadApplication>(), lo => lo.Appl_No, la => la.Appl_No, (lo, la) => new <>f__AnonymousType0`2(SSN = lo.Cust_SSN, TDCCustID = lo.Cust_ID))'. Failure: Object reference not set to an instance of an object.

See InnerException for more details.

Complete Expression:

.Call System.Linq.Queryable.Join(
    .Constant<Telerik.OpenAccess.Query.ExtentQueryImpl`1[RmmDal.Tbl_Loan_Appl]>(Extent<RmmDal.Tbl_Loan_Appl>()),
    .Constant<Telerik.OpenAccess.Query.ExtentQueryImpl`1[RmmDal.Contexts.RmmCrm.LeadApplication]>(Extent<RmmDal.Contexts.RmmCrm.LeadApplication>()),

    '(.Lambda #Lambda1<System.Func`2[RmmDal.Tbl_Loan_Appl,System.Int64]>),

    '(.Lambda #Lambda2<System.Func`2[RmmDal.Contexts.RmmCrm.LeadApplication,System.Int64]>),

    '(.Lambda #Lambda3<System.Func`3[RmmDal.Tbl_Loan_Appl,RmmDal.Contexts.RmmCrm.LeadApplication,<>f__AnonymousType0`2[System.String,System.Int64]]>))

.Lambda #Lambda1<System.Func`2[RmmDal.Tbl_Loan_Appl,System.Int64]>(RmmDal.Tbl_Loan_Appl $lo) {
    $lo.Appl_No
}

.Lambda #Lambda2<System.Func`2[RmmDal.Contexts.RmmCrm.LeadApplication,System.Int64]>(RmmDal.Contexts.RmmCrm.LeadApplication $la)
{
    $la.Appl_No
}

.Lambda #Lambda3<System.Func`3[RmmDal.Tbl_Loan_Appl,RmmDal.Contexts.RmmCrm.LeadApplication,<>f__AnonymousType0`2[System.String,System.Int64]]>(
    RmmDal.Tbl_Loan_Appl $lo,
    RmmDal.Contexts.RmmCrm.LeadApplication $la) {
    .New <>f__AnonymousType0`2[System.String,System.Int64](
        $lo.Cust_SSN,
        $lo.Cust_ID)
}
执行'Extent().Join(Extent(),lo=>lo.Appl\u No,la=>la.Appl\u No,(lo,la)=>new f\u匿名类型0`2(SSN=lo.Cust\u SSN,TDCCustID=lo.Cust\u ID')时发生异常。失败:对象引用未设置为对象的实例。
有关更多详细信息,请参见InnerException。
完整表达:
.Call System.Linq.Queryable.Join(
.常数(范围()),
.常数(范围()),
"(Lambda#Lambda1),,
"(Lambda#Lambda2),,
“(.Lambda#Lambda3))
.Lambda#Lambda1(RmmDal.Tbl_Loan_Appl$lo){
$lo.Appl_编号
}
.Lambda#Lambda2(RmmDal.Contexts.RmmCrm.LeadApplication$la)
{
$la.Appl_编号
}
.Lambda#Lambda 3(
RmmDal.Tbl_贷款申请$lo,
RmmDal.Contexts.RmmCrm.LeadApplication$la){
.New f__AnonymousType0`2[System.String,System.Int64](
$lo.Cust\U SSN,
$lo.客户识别码)
}

设计不支持连接来自两个不同上下文的实体。
连接这些数据集的唯一方法是像建议的那样使用内存中的连接

蛮力方法只需在两个上下文端点上调用
.ToList()
,然后在连接查询中使用内存中的数据即可。这将是低效且有问题的,因为大量数据将被放入内存中,并且可能在执行联接后被丢弃,因此性能可能非常差

一种更有效的方法是从左侧翻阅结果,并使用
.Contains()
方法从右侧筛选出“已加入”的记录

// Load a small fragment of leads in memory
var Leads1 = dbContextLMS.Tbl_Loan_Appls.Skip(0).Take(10).ToList();
// find the IDs
var leadIds = Leads1.Select(l= > l.Appl_No);
// filter out only the matching applications
var applications = dbContextRmmCrm.LeadApplications
                                  .Where(a=> leadIds.Contains(a.Appli_No))
                                  .Select(a=> new { SSN = a.Cust_SSN, TDCCustID = а.Cust_ID });

需要分页才能处理一小部分数据,以便将
.Contains()
子句安全地转换为SQL
in子句
。您必须将代码片段包装在一个循环中,并相应地增加
Skip()
Take()
参数。

我的想法是:两个不同的上下文表示不同的连接和工作单元,可能还有数据库,所以我不知道这是怎么可能的。您必须从这两个上下文中提取记录,并在客户端连接它们……这就是我们的想法