2015-06-04 6 views
0

сотрудников.DbScanExpression with join and left table select

У меня есть группа классов (таблиц), которые имеют некоторые общие свойства (столбцы). То, что я хотел бы сделать, это использовать запросы EntityFramework для перехвата и изменять их.

Я хотел бы добавить join и some where where. Но не знаю, как проецировать левую таблицу без явного выбора свойств.

Первоначальный запрос, как это: context.Loans

SQL

SELECT 
    [LoanNumber] AS [LoanNumber], 
    [SEC_OWNER] AS [SEC_OWNER] 
FROM [dbo].[Loans] 

должен быть изменен следующим образом:

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] 

Спасибо заранее,

/Артем

ответ

0

В работе вокруг этого вопроса мы удалили JOIN из запроса и решил использовать подзапросы.

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); 
     } 

.Select (и => u.Property ("SEC_ID")). Возьмем (1) .Element() вычисляет ВЫБРАТЬ TOP 1