Как Вы добавляете динамичный, 'где' пункты к linq запрашивают?

, пожалуйста, взгляните на этот вопрос: Какие варианты использования для «размещения нового»?

new (address) varname;

- это так называемый оператор размещения нового, который создает объект предварительно выделенный буфер.

Таким образом, ответ на ваш вопрос: он не выделяет новую память.

25
задан Nick 7 October 2008 в 21:03
поделиться

6 ответов

Можно использовать класс PredicateBuilder .

PredicateBuilder был выпущен в пакет LINQKit NuGet

, LINQKit является свободным набором расширений для LINQ к SQL и продвинутым пользователям Платформы Объекта.

32
ответ дан 28 November 2019 в 21:11
поделиться

Принятие Ваших значений 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, это будет работать вместо циклов, но понятие должно быть тем же.

3
ответ дан 28 November 2019 в 21:11
поделиться

Существует несколько способов, которыми можно сделать это:

Динамические библиотеки запроса 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

3
ответ дан 28 November 2019 в 21:11
поделиться

Вот один из способов добавления переменного числа предложений , где , в ваш запрос 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;
3
ответ дан 28 November 2019 в 21:11
поделиться

Как это? Это не динамический 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;    
}
1
ответ дан 28 November 2019 в 21:11
поделиться
private List<User> GetUsersFromRoles(uint UserRoles) {
  return from u in dc.Users            
         where (u.UserRolesBitmask & UserRoles) != 0
         select u;
}

Параметр UserRoles должен предоставляться в виде битовой маски, а не массива.

0
ответ дан 28 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: