Присоединяйтесь к отдельным — перевод SQL в Linq Query

Я пытаюсь перевести SQL-запрос в рабочий оператор linq, к сожалению, это не так просто, как ожидалось.

Исходный SQL-запрос выглядит следующим образом:

SELECT DISTINCT tt1.ArtikelId
FROM
(
    SELECT ArtikelId FROM [dbo].[ArtSearchEinfachView]
    WHERE Feld = 'Listungsstatus' AND Wert = '0'
) tt1
INNER JOIN
(
    SELECT ArtikelId FROM [dbo].[ArtSearchEinfachView]
    WHERE Feld = 'AktiverAktikel' AND Wert = '1'
) tt2
ON tt1.ArtikelId = tt2.ArtikelId
INNER JOIN
(
    SELECT ArtikelId FROM [dbo].[ArtSearchEinfachView]
    WHERE Feld = 'Artikelbezeichnung' AND Wert like '%berentzen%'
) tt3
ON tt1.ArtikelId = tt3.ArtikelId

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

Я попытался преобразовать его. Я использую диспетчер объектов devforce, но, к сожалению, он не работает:

    public async Task<int> LadeArtikelCountEinfachNew(string sucheingabe)
    {
        var query = _artikelContainer.ArtSearchEinfach.Where(p => p.Feld == "Listungsart" && p.Wert == "0");

        query = query.Join(_artikelContainer.ArtSearchEinfach.Where(x => x.Feld == "AktiverAktikel" &&
                                                                         x.Wert == "1"),
                            x => x.ArtikelId,
                            y => y.ArtikelId,
                            (x,y) => y).Distinct();
        query = query.Join(_artikelContainer.ArtSearchEinfach.Where(p => p.Feld == "Artikelbezeichnung" &&
                                                                         p.Wert.Contains(sucheingabe)),
                            x => x.ArtikelId,
                            y => y.ArtikelId,
                            (x, y) => y).Distinct();

        return await query.AsScalarAsync().Count();
    }

Кто-нибудь может мне помочь?


person Jannik    schedule 08.10.2014    source источник


Ответы (1)


Я не могу сказать, что понимаю, почему вы используете несколько внутренних соединений в одной таблице вместо предложений и/или, но я предполагаю, что для этого есть веская причина. Вероятно, ближайший аналогичный запрос LINQ для того, что вы делаете, использует анонимные проекции:

   var query = _artikelContainer.ArtSearchEinfach
     .Where(p => p.Feld == "Listungsart" && p.Wert == "0")
     .Select(p => new { p.ArtikelId } );

   query = query.Join(_artikelContainer.ArtSearchEinfach
        .Where(x => x.Feld == "AktiverAktikel" && x.Wert == "1")
        .Select(x => new { x.ArtikelId } ),
      x => x.ArtikelId,
      y => y.ArtikelId,
      (x,y) => y);

   query = query.Join(_artikelContainer.ArtSearchEinfach
         .Where(p => p.Feld == "Artikelbezeichnung" && p.Wert.Contains(sucheingabe))
         .Select(p => new { p.ArtikelId } ),
      x => x.ArtikelId,
      y => y.ArtikelId,
      (x, y) => y);

   var results = await query.Distinct().ExecuteAsync();
person Kim Johnson    schedule 09.10.2014
comment
Причина, по которой я использую его, заключается в том, что это Product-Indexing-Table. Продукт имеет 100 таблиц с данными, и мы собираем все данные, которые нам нужны для нашей страницы поиска (индексируя все данные), в одну таблицу, поэтому наш проект должен использовать только эту единственную таблицу для поиска определенного продукта. Это делает наш поиск продуктов намного быстрее, чем объединение всех таблиц и так далее. Спасибо, этот работает нормально. :) - person Jannik; 20.10.2014