, пожалуйста, взгляните на этот вопрос: Какие варианты использования для «размещения нового»?
new (address) varname;
- это так называемый оператор размещения нового, который создает объект предварительно выделенный буфер.
Таким образом, ответ на ваш вопрос: он не выделяет новую память.
Можно использовать класс PredicateBuilder .
PredicateBuilder был выпущен в пакет LINQKit NuGet
, LINQKit является свободным набором расширений для LINQ к SQL и продвинутым пользователям Платформы Объекта.
Принятие Ваших значений UserRoles является самостоятельно битовыми масками, что-то вроде этого работало бы?
private List<User> GetUsersFromRoles(uint[] UserRoles) {
uint roleMask = 0;
for (var i = 0; i < UserRoles.Length;i++) roleMask= roleMask| UserRoles[i];
// roleMasknow contains the OR'ed bitfields of the roles we're looking for
return (from u in dc.Users where (u.UserRolesBitmask & roleMask) > 0) select u);
}
существует, вероятно, хороший синтаксис LINQ, это будет работать вместо циклов, но понятие должно быть тем же.
Существует несколько способов, которыми можно сделать это:
Динамические библиотеки запроса LINQ: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Деревья выражений & выражения Lamda: http://msdn.microsoft.com/en-us/library/bb882637.aspx
Вот один из способов добавления переменного числа предложений , где , в ваш запрос LINQ. Обратите внимание, что я не коснулся вашей логики битовой маски, я просто сосредоточился на множественных , где с.
// C#
private List<User> GetUsersFromRoles(uint[] UserRoles)
{
var users = dc.Users;
foreach (uint role in UserRoles)
{
users = users.Where(u => (u.UserRolesBitmask & role) == role);
}
return users.ToList();
}
РЕДАКТИРОВАТЬ: На самом деле, это будет И в , где предложения, и вы хотели ИЛИ их. Следующий подход (внутреннее объединение) работает в LINQ to Objects, но не может быть переведен в SQL с LINQ to SQL:
var result = from user in Users
from role in UserRoles
where (user.UserRolesBitmask & role) == role
select user;
Как это? Это не динамический linq, но выполняет цель.
private List<User> GetUsersFromRoles(uint[] userRoles)
{
List<User> users = new List<User>();
foreach(uint userRole in UserRoles)
{
List<User> usersInRole = GetUsersFromRole(userRole);
foreach(User user in usersInRole )
{
users.Add(user);
}
}
return users;
}
private List<User> GetUsersFromRole(uint userRole)
{
var users = from u in dc.Users
where ((u.UserRolesBitmask & UserRole) == UserRole)
select u;
return users;
}
private List<User> GetUsersFromRoles(uint UserRoles) {
return from u in dc.Users
where (u.UserRolesBitmask & UserRoles) != 0
select u;
}
Параметр UserRoles должен предоставляться в виде битовой маски, а не массива.