加入distinct - 将SQL转换为Linq查询

时间:2014-10-08 12:18:32

标签: linq-to-entities devforce

我正在尝试将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();
    }

有人可以帮助我吗?

1 个答案:

答案 0 :(得分: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();
相关问题