T-SQL (заказ по случаю) в LinQ - PullRequest
1 голос
/ 01 марта 2012

У меня есть следующее заявление, и я хотел бы иметь эквивалент LINQ:

SELECT *

  FROM People

  where Name like '%something%'

  ORDER BY CASE 

  WHEN Name LIKE 'something%' then 1

  WHEN Name LIKE '%something%' then 2

  ELSE 3 END

По сути, я извлекаю все строки, содержащие значение (в данном случае «что-то»), и упорядочиваю их: сначала те, которые начинаются с этого значения, а затем остальные.

Есть идеи, как это сделать в LinQ?

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Я предложил следующее решение.

var dc = new EntityContext();

var result = dc 
// Condition part
.People.Where(x => x.Name.IndexOf("Foo") > -1) // This part is translated to like
// projection part
.Select(x => new { Person = x, Weight = x.Name.IndexOf("Bar") > -1 ? 1 : (x.Name.IndexOf("Baz") ? 2 : 0)})
// Order
.OrderBy(x => x.Weight)
// Final projection
.Select(x => x.Person);

Я думаю, все говорит само за себя.Сначала вы выбираете в соответствии с вашими условиями, затем создаете новый объект с необходимыми весами, затем заказываете его и, наконец, берете необходимых людей.

0 голосов
/ 01 марта 2012

Я не могу это проверить, но что-то подобное может сработать. Код определенно можно оптимизировать / очистить, но теоретически это может сработать:)

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

var queryResult = 
     people
    .Where(person=>person.name.Contains(@"/something/"))
    .OrderBy(person=>person.Name, 
        delegate(string name1, string name2)
        {
            int result1, result2;
            if(name1.Contains(@"something/")) result1 = 1;
            else if(name1.Contains(@"/something/")) result1 = 2;
            else result1 = 3;

            if(name2.Contains(@"something/")) result2 = 1;
            else if(name2.Contains(@"/something/")) result2 = 2;
            else result2 = 3;

            return result1.CompareTo(result2);
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...