Задать вопрос
Daeamon
@Daeamon

Возможно ли подобный SQL запрос преобразовать в LINQ?

Здравствуйте, помогите пожалуйста справиться с запросом.

Сам он такой:
SELECT * 
FROM [DB].[dbo].[items]
WHERE id IN(
	SELECT TOP (20) itemid
	FROM [DB].[dbo].[xref]
	WHERE EXISTS(
		SELECT id
		FROM [DB].[dbo].[vars]
		WHERE wordid = id AND ( word = 'WORD1' OR word = 'WORD2')
	)
	GROUP BY itemid
	ORDER BY COUNT(itemid) DESC, SUM(weight) DESC
)


Вот что у меня вышло но работает не так как надо что конечно логично(в коде я убрал различные проверки что бы его сократить)... Помогите сделать правильно

string[] searchArray = {"WORD1","WORD2"};

int[] searchedVars = db.vars.Where(o => searchArray.Contains(o.word)).Select(o => o.id).ToArray();

int tmpword = searchedVars[0];
Expression<Func<xref, bool>> whExp = o => o.wordid == tmpword;


int searchedVarsCount = searchedVars.Count();

for (int i = 1; i < searchedVarsCount; i++)
{
    tmpword = searchedVars[i];
    whExp = whExp.Or(o => o.wordid == tmpword);
}

whExp = whExp.Expand();

int[] SearchedIndexes = db.xref.Where(whExp)
    .GroupBy(s => s.itemid)
    .Select(g => new
    {
        ItemId = g.Key,
        Score = g.Sum(s => s.weight),
        CountItemId = g.Count()
    })
    .OrderByDescending(r => r.CountItemId)
    .ThenByDescending(r => r.Score)
    .Skip(0)
    .Take(limit)
    .Select(o => o.ItemId)
    .ToArray();

List<items> Searched = db.items.Where(o => SearchedIndexes.Contains(o.id)).ToList();
  • Вопрос задан
  • 603 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@i_light
Backend, XAML, crossplatform
Не очень понял конструкцию с whExp, вот мой вариант:

string[] searchArray = {"WORD1","WORD2"};
var vars = db.vars.Where(v =>  searchArray.Contains(v.word)).Select(v => v.id);

var xrefs = dr.xref.Where(x => vars.Contains(x.wordid)).GroupBy(x => x.itemid)
    .Select(g => new
    {
        ItemId = g.Key,
        Score = g.Sum(s => s.weight),
        CountItemId = g.Count()
    })
    .OrderByDescending(r => r.CountItemId)
    .ThenByDescending(r => r.Score)
    .Take(20)
    .Select(o => o.ItemId);

var items = db.Items.Where(i => xrefs.Contains(i.id));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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