代码之家  ›  专栏  ›  技术社区  ›  JP Hellemons

将SQL查询转换为LINQ

  •  1
  • JP Hellemons  · 技术社区  · 15 年前

    我有一个初级linq2sql问题。我有一个巨大(但不复杂)的SQL语句:

    SELECT Artikel.ArtikelID, 
           Artikel.CategorieID, 
           Artikel.ImageFile, 
           Artikel.RetailPrijs, 
           ISNULL(ShopArtikel.VerkoopsPrijs, Artikel.VerkoopsPrijs) AS VerkoopsPrijs, 
           Artikel.ArtikelCode, 
           Artikel.InAssortimentSinds, 
           ArtikelTaal.ArtikelNaam, 
           ArtikelTaal.ArtikelOmschrijving
    FROM   Artikel 
    INNER JOIN ArtikelTaal ON Artikel.ArtikelID = ArtikelTaal.ArtikelID 
    INNER JOIN ShopArtikel ON Artikel.ArtikelID = ShopArtikel.ArtikelID 
    INNER JOIN Categorie ON Artikel.CategorieID = Categorie.CategorieID 
    INNER JOIN CategorieTaal ON Categorie.CategorieID = CategorieTaal.CategorieID 
    INNER JOIN Shop ON ShopArtikel.ShopId = Shop.ShopID 
    INNER JOIN CategorieGroepShop ON Shop.ShopID = CategorieGroepShop.ShopId 
    INNER JOIN Taal ON ArtikelTaal.TaalCode = Taal.TaalCode AND CategorieTaal.TaalCode = Taal.TaalCode 
    INNER JOIN CategorieGroepTaal ON Taal.TaalCode = CategorieGroepTaal.TaalCode AND CategorieGroepShop.CategorieGroepId = CategorieGroepTaal.CategorieGroepID 
    INNER JOIN CategorieGroep ON Categorie.CategorieGroepID = CategorieGroep.CategorieGroepID AND CategorieGroepTaal.CategorieGroepID = CategorieGroep.CategorieGroepID AND CategorieGroepShop.CategorieGroepId = CategorieGroep.CategorieGroepID
    WHERE (Shop.ShopID = 23) AND 
          (Taal.TaalCode = 'dut') AND 
          (Artikel.Onzichtbaar = 0) AND 
          (Artikel.NietBestelbaar = 0) AND 
          (Categorie.Onzichtbaar = 0) AND 
          (Artikel.Voorraad >= Artikel.LevertijdDrempel)
    

    我要把它转换成LINQ,并得到:

    var allProducts = from artikelen in dc.Artikels
    join sa in dc.ShopArtikels on artikelen.ArtikelID equals sa.ArtikelID
    join at in dc.ArtikelTaals on artikelen.ArtikelID equals at.ArtikelID
    join cat in dc.Categories on artikelen.CategorieID equals cat.CategorieID
    join catt in dc.CategorieTaals on cat.CategorieID equals catt.CategorieID
    join catg in dc.CategorieGroeps on cat.CategorieGroepID equals catg.CategorieGroepID
    join catgt in dc.CategorieGroepTaals on catg.CategorieGroepID equals catgt.CategorieGroepID
    join sh in dc.Shops on sa.ShopId equals sh.ShopID
    join catgs in dc.CategorieGroepShops on sh.ShopID equals catgs.ShopId
    join tl in dc.Taals on new { tc1 = at.TaalCode, tc2 = catgt.TaalCode } equals new { tc1 = tl.TaalCode, tc2 = tl.TaalCode } 
    where sh.ShopID == shop.BLL.Business.ShopController.CurrentShop.Id
    select dc.Artikels;
    

    但我认为我在加入时犯了一些小错误。 有什么想法吗?

    编辑 我已将Linq查询重写为:

    var allProducts = from artikelen in dc.Artikels
    join at in dc.ArtikelTaals on artikelen.ArtikelID equals at.ArtikelID
    join sa in dc.ShopArtikels on artikelen.ArtikelID equals sa.ArtikelID
    join cat in dc.Categories on artikelen.CategorieID equals cat.CategorieID
    join catt in dc.CategorieTaals on cat.CategorieID equals catt.CategorieID
    join sh in dc.Shops on sa.ShopId equals sh.ShopID
    join catgs in dc.CategorieGroepShops on sh.ShopID equals catgs.ShopId
    join tl in dc.Taals on new { tc1 = at.TaalCode, tc2 = catt.TaalCode } equals new { tc1 = tl.TaalCode, tc2 = tl.TaalCode } 
    join catgt in dc.CategorieGroepTaals on new { tl.TaalCode, catgs.CategorieGroepId } equals new { catgt.TaalCode, catgt.CategorieGroepID }
    join catg in dc.CategorieGroeps on new { cat.CategorieGroepID, catgt.CategorieGroepID, catgs.CategorieGroepId } equals new { catg.CategorieGroepID, catg.CategorieGroepID, catg.CategorieGroepID }
    where sh.ShopID == 230
    select dc.Artikels;
    

    但是在“dut”后面有语法错误 编辑2: 更改了联接并用数据库中的相应字段替换了“dut”。 第一个之后仍然有错误 它说:类型推断在对“join”的调用中失败

    4 回复  |  直到 15 年前
        1
  •  2
  •   Joachim VR    15 年前

    有些SQL联接有多个联接条件,但您没有将其放入LINQ查询中。

        2
  •  1
  •   Kirk Broadhurst    15 年前

    如果这是经常运行的东西,那么您应该将其重写为存储过程。我认为这对于一个LINQ声明来说太复杂了,太难理解到底发生了什么。

        3
  •  0
  •   mavera    15 年前

    有一个工具,但我没试过。可能对你有用。

    http://www.sqltolinq.com/

        4
  •  0
  •   Benedict    15 年前

    看起来错误行实际上是一个“where”原因,而不是“join”。 实际上,可以将整个长LINQ语句拆分为较小的查询。

    因此,在这种情况下,最好这样拆分它:

    var at = from a in dc.ArtikelTaals
               where a.TaalCode == "dut"
               select a;
    
    var catt = from c in dc.CategorieTaals
               where c.TaalCode == "dut"
               select c;
    
    .....
    

    稍后您可以在复杂的查询中加入IQueryable“at”和“catt”。