Как структурировать частично динамический оператор LINQ? - PullRequest
0 голосов
/ 25 мая 2011

У меня в настоящее время есть метод в моем хранилище, такой как:

    public int GetMessageCountBy_Username(string username, bool sent)
    {
        var query = _dataContext.Messages.AsQueryable();

        if (sent)
            query = query.Where(x => x.Sender.ToLower() == username.ToLower());
        else
            query = query.Where(x => x.Recipient.ToLower() == username.ToLower());

        return query.Count();
    }

В настоящее время он создает один из двух запросов на основе логического значения sent.Это лучший способ сделать это или есть способ сделать это в самом запросе?Я хочу проверить, равен ли x.Sender username, равен ли sent истина.Но я хочу проверить, равен ли x.Recipient username, равен ли sent ложь.

Затем я хочу, чтобы это выражение LINQ преобразовалось в SQL в Entity Framework, что, я полагаю, делает.

Я просто хочу не повторять как можно больше кода.

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Вы можете сделать что-то вроде этого:

public int GetMessageCountBy_Username(string username, bool sent)
 {
     Func<Message, string> userSelector = m => sent ? m.Sender : m.Recipient;
     var query =
     _dataContext.Messages.AsQueryable()
     .Where(x => userSelector(x).ToLower() == username.ToLower());
     return query.Count();
 } 

Таким образом, выбор правильного пользователя (отправителя или получателя) выполняется перед частью linq, что избавляет вас от повторения дважды.

2 голосов
/ 25 мая 2011

Да, я считаю, что это правильный способ сделать это.Потому что легко создавать сложные запросы без повторения целых частей запросов.

И ваши мысли о переводе на SQL тоже верны.Но будьте осторожны, это делается в тот момент, когда запрашиваются данные или согласование.В вашем случае SQL будет сгенерирован и выполнен при вызове Count().

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