Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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# LINQ到实体-同一表上的多个联接_C#_Sql_Linq - Fatal编程技术网

C# LINQ到实体-同一表上的多个联接

C# LINQ到实体-同一表上的多个联接,c#,sql,linq,C#,Sql,Linq,我目前在T-SQL中有一些存储过程,我希望将其转换为LINQ to实体,以提高可维护性。然而,无论我如何构造LINQ查询,当我检查生成的代码时,它都是一个令人憎恶的、性能极其糟糕的怪物。我已经研究了“let”子句、联接的各种组合,将“where”子句转换为匿名类型选择的内部和外部,甚至在其他标记中使用扩展“.where()”方法,似乎没有任何东西能够生成与我期望或需要的代码相近的代码 困难似乎有三方面: 我需要做的连接是关于布尔值的组合,而LINQ到实体似乎只有用于Equijoin的连接功能。

我目前在T-SQL中有一些存储过程,我希望将其转换为LINQ to实体,以提高可维护性。然而,无论我如何构造LINQ查询,当我检查生成的代码时,它都是一个令人憎恶的、性能极其糟糕的怪物。我已经研究了“let”子句、联接的各种组合,将“where”子句转换为匿名类型选择的内部和外部,甚至在其他标记中使用扩展“.where()”方法,似乎没有任何东西能够生成与我期望或需要的代码相近的代码

困难似乎有三方面:

  • 我需要做的连接是关于布尔值的组合,而LINQ到实体似乎只有用于Equijoin的连接功能。如何翻译这些连接
  • 我需要使用不同的join/where子句在同一个表上进行多次不同的连接,以便为每个记录选择不同的值。如何在LINQ中实现这一点
  • 如何防止实体集合上的联接变成嵌套的混乱
我试图翻译的T-SQL查询是这样的(其中硬编码的数字是特定的硬编码类型):

选择传输。*,
[地址].第一街,
承运人1保险。保险编号,
承运人2保险。保险编号,
承运人3保险。保险号码
从运输
内部连接运输时指定。指定键=指定。指定键
指定时内部加入患者。PatientKEY=患者。PatientKEY
[Address]上的左外部联接[Address]。AddressFKEY=Patient.PatientKEY和[Address]。AddressTypeByTableKEY=1
左侧外部连接PatientInsurance Carrier1 Carrier1上的保险。PatientKEY=Patient.PatientKEY和Carrier1保险。CarrierKEY=7
左侧外部连接PatientInsurance Carrier2Insurance ON Carrier2Insurance.PatientKEY=Patient.PatientKEY和Carrier2Insurance.CarrierKEY=8
左外接患者保险卡人3卡人身保险卡人3保险。患者钥匙=患者。患者钥匙和(卡人3保险。卡人钥匙7和卡人3保险。卡人钥匙=8)
其中(Transport.TransportDate>='07-01-2013'和Transport.TransportDate 0)
在LINQ的许多尝试中,最新的尝试是:

var medicareTransportList=来自ClientEDM.Transports中的transportItem
将patientAddress加入到ClientDM中。transportItem.Appoint.PatientKEY上的地址等于patientAddress.AddressFKEY
在客户中加入Carrier1保险DM.PatientInsurances on transportItem.Assignment.PatientKEY等于Carrier1保险.PatientKEY
在客户中加入Carrier2保险DM.PatientInsurances on transportItem.Assignment.PatientKEY等于Carrier2保险.PatientKEY
在客户中加入其他保险dm.patientinsurance on transportItem.Appoint.PatientKEY等于其他保险。PatientKEY
其中(transportItem.TransportDate>fromDate**transportItem.TransportDate-Transmit.CarrierKEY==0&&Transmit.PaidAmt>0.00M)&&
(carrier1Insurance.CarrierKEY==7)&&
(carrier2Insurance.CarrierKEY==8)&&
(otherInsurance.CarrierKEY!=7&&
otherInsurance.CarrierKEY!=8)&&
(patientAddress.AddressTypeByTableKEY==1)
选择新的
{
运输=运输项目,
耐心,
医疗保险=医疗再保险,
医疗补助=医疗保险,
其他=其他保险
};
LINQ
.Join()
运算符相当于
内部联接
SQL运算符

对于任何其他情况,请使用
.GroupJoin()
运算符

但是你真的需要使用join吗?在许多情况下,使用LINQ,可以使用实体之间的导航属性来表示SQL
JOIN
(内部或外部)


请解释您的概念数据模型以获得准确答案。

您最近的迭代有什么问题?另请参阅非相等连接。只根据需要加载挂起传输的实体是否有意义,或者您是否确实需要所有数据?最近的迭代的问题是,它生成了一条SQL语句,数百行,需要>30秒才能生成结果,而in-SQL查询显然只有几十个,只需几分钟就可以完成任务。此外,问题并不在于它是一个不相等的连接,而是基于多个条件。附加的“from”语句将生成数千行的交叉连接。@EricScherrer我现在正在研究这个问题,但由于它在我的程序中稍后才出现(我认为太深入了,无法在这里深入讨论),所以我对集合进行“迭代”并对其运行查询,如果不预先从SQL数据库加载这些信息,则意味着结果中的每一行(数千行)都会访问数据库一次。这些表中有多少数据,数百、数千或数十万条记录?