Конвертировать SQL-запрос в LINQ - PullRequest
1 голос
/ 17 сентября 2010

У меня есть вопрос для начинающих 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;

но у меня есть идея, что я допустил некоторые (незначительные) ошибки при присоединении. любые идеи, пожалуйста!

EDIT Я переписал запрос 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 ]

2 голосов
/ 17 сентября 2010

У некоторых SQL-соединений есть несколько условий соединения, которые вы не указали в запросе LINQ.

1 голос
/ 20 сентября 2010

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

0 голосов
/ 20 сентября 2010

Похоже, что строка ошибки на самом деле является причиной "Где", но не "Соединением".На самом деле вы можете разбить весь длинный оператор 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 «в»и "catt" в вашем сложном запросе позже.

0 голосов
/ 17 сентября 2010

Для этого есть инструмент, но я его не пробовал.Может быть, это полезно для вас.

http://www.sqltolinq.com/

...