Я думаю, что вы можете сделать относительно легко в LINQ to SQL, но структура вашего уровня данных неожиданна с точки зрения LINQ. Я ожидаю, что если вы используете конструктор и у вас есть отношения, определенные в базе данных, у вас будут наборы сущностей, и вы сможете их использовать. Более естественный способ использования контекста данных, скажем, шаблона Repository, в качестве основы для запроса, вероятно, будет работать лучше. По сути, вам нужны пользователи, у которых есть какие-либо ассоциации, в которых набор групп, с которыми они связаны, содержит группу с соответствующим именем.
РЕДАКТИРОВАТЬ : Я думаю, что я на самом деле говорю пусть LINQ будет LINQ . LINQ - это ориентированный на контекст данных ORM (облегченный), и вам нужно подумать об использовании LINQ с точки зрения контекста данных, чтобы он действительно работал для вас. Если вы будете придерживаться своей предыдущей перспективы, ориентированной на объекты данных, я думаю, вы будете разочарованы в LINQ.
Пример (в C #) - это не полный пример того, как реализовать репозиторий, просто
в иллюстративных целях.
public class UserRepository : IDisposable
{
private DataContext Context { get; set; }
private bool DisposeContext { get; set; }
public UserRepository() : this( null ) { }
public UserRepository( DataContext context ) // manual constructor injection
{
this.Context = context ?? new MyDataContext();
this.DisposeContext = context == null;
}
public IQueryable<User> GetListOfUsersByUserGroupName( string userGroupName )
{
return Context.Users
.Where( u => u.UserUserGroups
.Any( uug => uug.Groups
.Any( ug => ug.GroupName == userGroupName ) );
}
...
public void SaveChanges()
{
Context.SubmitChanges();
}
// insert canonical IDisposable pattern here and dispose of
// the data context if needed, don't dispose if injected
}
Используется как:
using (var repository = new UserRepository())
{
var users = repository.GetListOfUsersByUserGroupName( "admin" );
foreach (var admin in users)
{
SendMessage( admin, notification );
admin.LastNotified = DateTime.Now;
}
repository.SaveChanges();
}