2013-12-17 1 views
0

Состояние будет указано во время выполнения толькоDynamic Linq запрос для соединения двух таблиц с более чем одним условием (динамически)

Я попытался внутреннее соединение с двумя таблицами с одним условием динамично, оно работает нормально. , но с еще два или состояния динамически, его не working.Please помочь мне решить эту проблему

Пожалуйста, смотрите случаи

случай 1: присоединиться с одним условием (работает нормально)

Base entity:User 

entity to join :Role 

condition to join: Role.Id = User.RoleId 


//select * from User inner join Role on User.RoleId=Role.Id 

//static way 

    IQueryable<UserEntity> query = 
     db.Set<user>().Join(db.Set<Role>(), 
     user => User.RoleId, 
     role=> role.Id, 
     (user , role) => new { user , role }).Select(temp=> temp.user); 



//Dynamic Way **(working fine)**   


ParameterExpression lambdaExprVar_Role = Expression.Parameter(typeof(Role), "role"); 

      PropertyInfo rightPropertyInfo_role = typeof(Role).GetProperty("Id"); 

      Expression rightExpression_role = Expression.Property(lambdaExprVar_Role, rightPropertyInfo_role); 

      Expression<Func<Role, Int64>> myexp_role = Expression.Lambda<Func<Role, Int64>>(rightExpression_role , new ParameterExpression[] { lambdaExprVar_Role });     

      ParameterExpression lambdaExprVar_User = Expression.Parameter(typeof(User), "user"); 

      PropertyInfo rightPropertyInfo_user = typeof(User).GetProperty("RoleId"); 

      Expression rightExpression_user = Expression.Property(lambdaExprVar_User, rightPropertyInfo_user); 

      Expression<Func<User, Int64>> myexp_user = Expression.Lambda<Func<User, Int64>>(rightExpression_user, new ParameterExpression[] { lambdaExprVar_User });  

    IQueryable<OrganizationNode> query = db.Set<User>() 
       .Join(db.Set<Role>(), myexp_user, myexp_role, (user, role) => new {user, role}) 
       .Select(temp=>temp.user); 

случай 2: присоединиться два условия (не работает)

Base entity:User 

entity to join :Role 

condition to join: Role.Id==User.RoleId,Role.Code==User.RoleCode 

//select * from User inner join Role on User.RoleId=Role.Id and User.RoleCode=Role.Code 

//static way **(working fine)** 



    IQueryable<User> query = 
     db.Set<user>().Join(db.Set<Role>(), 
     **user => new { matchId = user.RoleId, matchcode= user.RoleCode}, 
     role=> new { matchId = role.Id, matchcode= role.code},** 
     (user , role) => new { user , role }).Select(temp=> temp.user); 

//Dynamic Way (**** not working) 

Помогите мне написать/переписать код.

ответ

0

Попробуйте это

from u in db.Set<user> 
inner join r in db.Set<Role> 
on new {r.Id, r.Code} equals {u.RoleId, u.RoleCode) 
select u 

Другой способ написания выше запрос Linq будет следующим:

from u in db.Set<user> 
from r in db.Set<Role>.Where(r.Id==RoleId && u.RoleCode==r.Code) 
select u 
Смежные вопросы