Entity framework 带join和left table select的DbScanExpression

Entity framework 带join和left table select的DbScanExpression,entity-framework,join,where,interceptor,Entity Framework,Join,Where,Interceptor,同事们 我有一组类(表),它们有一些公共属性(列)。我想做的是使用EntityFramework截取选择查询并修改它们 我想添加join和一些where子句。但不知道如何在没有显式属性选择的情况下投影左表 初始查询如下: 背景.贷款 SQL 应修改为以下内容: SELECT O.LoanNumber AS LoanNumber, O.SEC_OWNER AS SEC_OWNER, FROM dbo.Loans AS O LEFT OUTER JOIN dbo.Users

同事们

我有一组类(表),它们有一些公共属性(列)。我想做的是使用EntityFramework截取选择查询并修改它们

我想添加join和一些where子句。但不知道如何在没有显式属性选择的情况下投影左表

初始查询如下: 背景.贷款

SQL

应修改为以下内容:

SELECT 
    O.LoanNumber AS LoanNumber, 
    O.SEC_OWNER AS SEC_OWNER, 
FROM   dbo.Loans AS O
LEFT OUTER JOIN dbo.Users U
    ON 
        O.SEC_OWNER = U.SEC_ID 
        AND
        U.Name = N'root'
WHERE 
        ((256 = (O.SEC_PERMISSIONS & 256)) 
        AND 
        (O.SEC_OWNER = U.SEC_ID))


var joinExpression = expression.LeftOuterJoin(
                userEntityBase.Scan(),
                (l, r) =>
                    l.Property("SEC_OWNER").Equal(r.Property("SEC_ID"))
                    .And(r.Property("Name").Equal(DbExpression.FromString(this.UserName)))
                )
                .Where(
                    exp =>
                        DbExpressionBuilder
                            .Constant((int)AccessPermissions.OwnerRead).Equal(exp.Property("l").Property("SEC_PERMISSIONS").BitwiseAnd(DbExpressionBuilder.Constant((int)AccessPermissions.OwnerRead)))
                            .And(exp.Property("l").Property("SEC_OWNER").Equal(exp.Property("r").Property("SEC_ID")))
            );
据我所知,连接两个表中的项目列。但我只需要项目的初始选择,而不知道它

SELECT 
    [LoanNumber] AS [LoanNumber], 
    [SEC_OWNER] AS [SEC_OWNER]
提前感谢,


/Artem

作为解决该问题的方法,我们从查询中删除了JOIN,并决定使用subselect

public override DbExpression Visit(DbScanExpression expression) {

.Select(u=>u.Property(“SEC_ID”)).Take(1).Element()的计算结果是选择前1名

public override DbExpression Visit(DbScanExpression expression) {
                var userEntityBase = expression.Target.EntityContainer.GetEntitySetByName("User", true);

                var newExpression = expression
                    .Where(
                        exp =>
                            ...
                                .And(exp.Property("SEC_OWNER")
                                    .Equal(userEntityBase.Scan().Where(user => user.Property("NAME").Equal(DbExpression.FromString(UserName))).Select(u => u.Property("SEC_ID")).Take(1).Element())
                                )
                            )
                            ...
                );

                ...

            return base.Visit(expression);
        }