2014-02-20 4 views
1

Как я могу преобразовать следующий запрос T-SQL, который дает правильные результаты, в выражение LINQ в C#?Как преобразовать T-SQL в LINQ?

WITH CTE 
      AS (SELECT RN = ROW_NUMBER() OVER (PARTITION BY dbo.Product.ID ORDER BY dbo.Picture.UpdatedDate ASC) 
        ,Product.ID 
        ,Product.Name 
        ,Picture.Path 
       FROM Dbo.Product 
       INNER JOIN dbo.Product_Picture_Mapping 
        ON dbo.Product_Picture_Mapping.ProductID = dbo.Product.ID 
       INNER JOIN dbo.Picture 
        ON dbo.Picture.ID = dbo.Product_Picture_Mapping.PictureID) 
    SELECT ID AS 'ID' 
      ,Name AS 'Name' 
     FROM CTE 
     WHERE RN = 1 

Я пробовал следующий код.

var result= (from c in cd.Product 
       join pp in cd.Product_Picture_Mapping 
          on c.ID equals pp.ProductID 
         join pcc in cd.Picture 
          on pp.PictureID equals pcc.ID 
         select new ProductViewModel() { PicturePath = pcc.Path, ProductName = c.Name, ProductID = c.ID}).ToList(); 
+0

Что вы получаете? Исключение? Неверные данные? Выходы столбцов различаются между двумя запросами для стартеров. –

+0

поэтому, у меня есть только одна фотография, имя которой является продуктом1. product1 есть 4 картинки, я получаю только 1 строку через sql-запрос (это то, что я хочу) , но я получаю 4 строки через выражение лямбда, это проблема для меня. Я хочу только 1 строку –

+0

возможный дубликат [Row \ _number over (Partition by xxx) в Linq?] (http://stackoverflow.com/questions/9980568/row-number-over-partition-by-xxx-in- LINQ) –

ответ

0

Смотрите, если выполнены следующие работы:

var result= (from c in cd.Product 
       join pp in cd.Product_Picture_Mapping 
          on c.ID equals pp.ProductID 
       let pcc = pp.Pictures.FirstOrDefault() 
       select new ProductViewModel() 
       { 
        PicturePath = pcc.Path, 
        ProductName = c.Name, 
        ProductID = c.ID 
       }).ToList(); 

Глядя на ваши имена таблиц, похоже, у вас есть много-много таблицы (product_picture_mapping), который EF может быть в состоянии оптимизировать прочь, давая вам вариант сделать что-то вроде:

var result = from c in cd.Product 
      let ppc = c.Pictures.FirstOrDefault() 
      select new ProductViewModel 
      { 
       PicturePath = pcc.Path, 
       ProductName = c.Name, 
       ProductID = c.ID 
      }; 
Смежные вопросы