2010-04-14 2 views
3

У меня есть запрос SQL следующим образом:Linq для SQL запроса

Declare @DivisionNo INT 

    SET @DivisionNo = 5117 



    SELECT distinct CASE WHEN ISNULL([DivisionNo],'') <> @DivisionNo 
         THEN @DivisionNo ELSE [DivisionNo] END as DivisionNo 

     --,[RecordID]  
     ,[AcctCat]  
     ,[AcctCatDesc]  
     ,[CostCode]  
     ,[CostCodeDesc] 

    FROM [dbo].[vw_eSchdl_AcctCat_CostCode]  
    WHERE DivisionNo = @DivisionNo 

    UNION 

    SELECT distinct CASE WHEN ISNULL([DivisionNo],'') <> @DivisionNo 
         THEN @DivisionNo ELSE [DivisionNo] END as DivisionNo 

     --,[RecordID]  
     ,[AcctCat]  
     ,[AcctCatDesc]  
     ,[CostCode]  
     ,[CostCodeDesc] 

    FROM [dbo].[vw_eSchdl_AcctCat_CostCode]  
    WHERE AcctCat not in (
     SELECT [AcctCat]  
     FROM [dbo].[vw_eSchdl_AcctCat_CostCode] 
     WHERE DivisionNo = @DivisionNo 
) 

Как я могу дублировать его с помощью LINQ к SQL?

Благодаря

+0

Что вы пробовали? Можете ли вы получить часть пути, но где-то застрять? Можете ли вы опубликовать то, что у вас есть? Какой бит дает вам проблемы? Или вы не знаете, с чего начать? –

ответ

0

Нет лучшего способа узнать, чем сделать это самостоятельно, используя linqpad, если у вас есть немного времени. У вас может быть вкладка с открытым SQL и вкладка с LINQ и попытка дублировать результаты запроса.

2

Вы можете конвертировать из SQL в Linq с помощью Linqer. Вы можете скачать его с here.

+0

@Mark - LinqPad не будет преобразовывать SQL в Linq. Тем не менее, продукт Linqer будет. –

+0

@ Randy: Ой! Исправлено, спасибо. –

0

Как насчет функционально эквивалентного?

int divisionNo = 5117; 

var matches = from ac in context.AcctCatCostCodes 
       where ac.DivisionNo == divisionNo 
       select ac; 

var missingAcctCat = from ac in matches 
        select ac.AcctCat; 

var others = from ac in context.AcctCatCostCodes 
      where !missingAcctCat.Contains(ac.AcctCat) 
      select ac; 

var union = from ac in matches.Union(others) 
      select new 
      { 
       DivisionNo = ac.DivisionNo ?? divisionNo, 
       ac.AcctCat, 
       ac.AcctCatDesc, 
       ac.CostCode, 
       ac.CostCodeDesc 
      }; 

... так же, как методы вместо синтаксиса запроса ...

var matches = context.AcctCatCostCodes 
        .Where(ac => ac.DivisionNo == divisionNo); 

var missingAcctCat = matches.Select(ac => ac.AcctCat); 

var others = context.AcctCatCostCodes 
        .Where(ac => !missingAcctCat.Contains(ac.AcctCat)); 

var union = matches.Union(others).Select(ac => 
      new 
      { 
       DivisionNo = ac.DivisionNo ?? divisionNo, 
       ac.AcctCat, 
       ac.AcctCatDesc, 
       ac.CostCode, 
       ac.CostCodeDesc 
      }); 

... SQL генерируется LINQ2SQL ...

SELECT COALESCE([t4].[DivisionNo],@p2) AS [DivisionNo], 
     [t4].[AcctCat], 
     [t4].[AcctCatDesc], 
     [t4].[CostCode], 
     [t4].[CostCodeDesc] 
FROM (
    SELECT [t3].[AcctCat], [t3].[AcctCatDesc], [t3].[CostCode], 
      [t3].[CostCodeDesc], [t3].[DivisionNo] 
    FROM (
     SELECT [t0].[RecordID], [t0].[AcctCat], [t0].[AcctCatDesc], 
       [t0].[CostCode], [t0].[CostCodeDesc], [t0].[DivisionNo] 
     FROM [AcctCatCostCode] AS [t0] 
     WHERE [t0].[DivisionNo] = @p0 
     UNION 
     SELECT [t1].[RecordID], [t1].[AcctCat], [t1].[AcctCatDesc], 
       [t1].[CostCode], [t1].[CostCodeDesc], [t1].[DivisionNo] 
     FROM [AcctCatCostCode] AS [t1] 
     WHERE NOT (EXISTS(
      SELECT NULL AS [EMPTY] 
      FROM [AcctCatCostCode] AS [t2] 
      WHERE ([t2].[AcctCat] = [t1].[AcctCat]) 
        AND ([t2].[DivisionNo] = (@p1)) 
      )) 
     ) AS [t3] 
    ) AS [t4] 
Смежные вопросы