我是C#和EntityFramework的初学者,如果我的英语不好,请原谅。
我想通过LinQ到实体在一个查询中连接两个表(OPE_TABLE,CLASS_TABLE)。当我从查询中删除join-CLASS_TABLE时,我能够确认该数据。
添加join-CLASS_TABLE,然后我收到“不能在单个查询执行中使用多个上下文示例。请确保查询使用单个上下文示例”。我不知道这是什么意思。我知道OPE_TABLE被视为一个表,因为它是自联接的。
OPE_TABLE和CLASS_TABLE上下文定义在不同的文件中。是否可以在单个查询中使用多个上下文来检索数据?
这是理想的。
SELECT T2.OPECD
, T2.OPENM
FROM OPE_TABLE T1
LEFT JOIN OPE_TABLE T2
ON T2.CLAID = T1.CLAID
AND T2.CLBID = T1.CLBID
AND T2.POSITIONID IN ('00001', '00002', '00003')
AND T2.DELETEKB = '1'
OR T2.OPECD = T1.OPECD
LEFT JOIN CLASS_TABLE CL
ON CL.CLASSID = T2.CLASSID
AND CL.CLASSKB = '6'
WHERE T1.TANCD = :arg_CD
ORDER BY CASE WHEN T1.OPECD = T2.OPECD THEN 0 ELSE 1 END
, CL.OPEID
, T2.OPENM
代码如下。谢谢。
namespace Inf.Operator
{
public class EFoperatorRepository
{
private readonly operatorContext _context;
private readonly classContext _classContext;
public EFoperatorRepository(operatorContext context, classContext classContext)
{
_context = context;
_classContext = classContext;
}
public IEnumerable<Operator> FindIdAndNm(string arg_CD)
{
var list = new List<string> { "00001", "00002", "00003" };
var query = (from t1 in _context.OPE_TABLE
where t1.operatorId.Equals(arg_CD)
join t2 in _context.OPE_TABLE
on new { t1.departmentId, t1.teamId }
equals new { t2.departmentId, t2.teamId } into ts
from tsResult in ts.DefaultIfEmpty()
where list.Contains(tsResult.positionId)
&& tsResult.deletekb.Equals("1")
|| tsResult.opeCd.Equals(t1.opeCd)
// ★↓If this is removed, data can be acquired.
// However, if you include it, an error occurs.
join cl in _classContext.CLASS_TABLE
on tsResult.groupId equals cl.classId
where cl.classKb.Equals("6")
// ★↑
select new
{
tsResult.operatorCd,
tsResult.operatorNm
}
)ToList();
foreach (var item in query)
{
Console.WriteLine(item);
}
}
}
}
1条答案
按热度按时间gg0vcinb1#
错误消息会告诉您问题的确切原因:在一个查询中使用两个上下文(
_classContext
和_context
),这是不可能的。我假设您的两个上下文Map到不同的数据库,因此只需在“主”数据库上创建一个视图,从第二个数据库中提取数据并Map。