2013-04-16 3 views
0

Я хочу выполнить поиск в базе данных пользователей и заказать мои результаты в соответствии с тем, насколько точна совпадение. В качестве примера должны быть указаны точные совпадения имени пользователя в результатах перед однословным совпадением.Объедините результаты нескольких запросов с одним запросом

Это то, что я есть (переменная «значение» содержит слово для поиска и «запрос» содержит начальный запрашиваемых я хочу изменить)

 var values = value.Split(new [] {' ','\t', '\n', '\r'}); 

     var q1 = query.Where(u => u.Id == valueAsInt || u.ExternalId == valueAsInt); 
     var q2 = query.Where(u => u.Name.Contains(value) || u.Username.Contains(value)); 
     var q3 = query.Where(u => values.All(i => u.Name.Contains(i)) || values.All(i => u.Username.Contains(i))); 
     var q4 = query.Where(u => values.Any(i => u.Name.Contains(i)) || values.Any(i => u.Username.Contains(i))); 

Однако, теперь я хочу, чтобы объединить результаты q1 через q4 и получить новый запрос, который я могу передать. Я также хочу, чтобы сохранить порядок моих запросов, и, честно говоря, я понятия не имею, как идти об этом ..

+1

Вы можете попробовать контактировать результаты. Я не уверен, сохранился ли заказ. var qAll = q1.Concat (q1) .Concat (q2) .Concat (q3) .Concat (q4); Было бы интересно посмотреть, работает ли оно так, как ожидалось. Вы могли бы добавить дополнительный столбец упорядочения для каждого запроса, чтобы иметь что-то по порядку. –

+0

@SilasHansen Спасибо, я попробую и посмотрю, как это работает – Toodleey

+0

@SilasHansen, похоже, работает нормально, конкретизировал все вместе и сделал отличный результат. не уверен в заказе, так как выясняется, что запрос будет переупорядочен позже. – Toodleey

ответ

0

Вы должны использовать ранжирование. например

var result = query.Select(u => 
{ 
    if (u.Id == valueAsInt || u.ExternalId == valueAsInt) 
     return new {Rank = 1, Item = u}; 
    if (u.Name.Contains(value) || u.UserName.Contains(value)) 
     return new {Rank = 2, Item = u}; 
    //Add the other conditions in here 
    return new {Rank = 3, Item = u}; 
}).OrderBy(u => u.Rank).Select(u => u.Item); 
Смежные вопросы