【问题标题】:Join with distinct - Translating SQL to Linq QueryJoin with distinct - 将 SQL 转换为 Linq 查询
【发布时间】:2014-10-08 12:18:32
【问题描述】:

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

有人可以帮帮我吗?

【问题讨论】:

    标签: linq-to-entities devforce


    【解决方案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();
    

    【讨论】:

    • 我之所以使用它是因为它是一个产品索引表。一个产品有 100 个包含数据的表,我们将搜索页面所需的所有数据(索引所有数据)放在一个表中,因此我们的项目只需要使用这个表来搜索特定产品。这使得我们的产品搜索比连接所有表格等要快得多。谢谢,这个很好。 :)
    猜你喜欢
    • 2020-03-13
    • 2020-01-13
    • 2017-07-12
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多