LINQ - выбор по имени свойства - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующий класс:

public class User
{
    public string userName { get; set; }
    public bool active { get; set; }
}

Пример:

{
   userName: John,
   active: true
},
{
   userName: Mary,
   active: true
}

Как мне запросить «активных» пользователей по имени свойства? Это то, что я пробовал, но получаю:

«Выражение LINQ ... не может быть переведено. Перепишите запрос в форме, которую можно перевести, или переключитесь на оценку клиента. явно путем вставки вызова к AsEnumerable (), AsAsyncEnumerable (), ToList () или ToListAsyn c () "

Type t = typeof(User);
PropertyInfo p = t.GetProperty("active");

int totalActive = userContext.Users.Where(u => Convert.ToBoolean(p.GetValue(u)) == true).Count();

Ответы [ 4 ]

1 голос
/ 14 июля 2020

Если по какой-то причине вам нужно выполнить это динамически, вам нужно будет построить дерево выражений (проверьте Queryable.Where подпись) вручную:

public class User
{
    public string userName {get;set;}
    public bool active {get;set;}
}

Type t = typeof(User);
PropertyInfo p = t.GetProperty("active");

var prmtr = Expression.Parameter(t);
var value = Expression.Constant(true);
var comprasion = Expression.Equal(Expression.Property(prmtr, p), value);
var expr = Expression.Lambda<Func<User, bool>>(comprasion, prmtr);

int totalActive = userContext.Users.Where(expr).Count();
0 голосов
/ 14 июля 2020

Это вопрос о оценке клиента и сервера .

Поскольку вы используете некоторые методы в условии where, которые не распознаются на sql на стороне сервера , вы можете преобразовать весь текущий linq в на стороне клиента для выполнения.

То есть добавить AsEnumerable() или ToList() в userContext.Users.

Пример:

int totalActive = userContext.Users.AsEnumerable().Where(u => Convert.ToBoolean(p.GetValue(u)) == true).Count();

Другой способ: вы также можете преобразовать все операторы linq в sql на стороне сервера распознанных операторов для выполнения, как указано в ответе @ Guru Stron выше.

0 голосов
/ 14 июля 2020
int totalActive = userContext.Users.Where(u => u.active).Count();
0 голосов
/ 14 июля 2020

Как говорится в сообщении об ошибке, вам необходимо вызвать AsEnumerable (), прежде чем пытаться фильтровать данные в предложении Where.

Type t = typeof(User);
PropertyInfo p = t.GetProperty("active");

int totalActive = userContext.Users.AsEnumerable().Where(u => Convert.ToBoolean(p.GetValue(u)) == true).Count();

Это потому, что linq попытается преобразовать ваше выражение в запрос sql , и вы используете функцию в статусе where, linq не сможет преобразовать это выражение, потому что функция не существует в sql.

AsEnumerable () заставит запрос выполняться и извлекать данные в память , то c# применит фильтрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...