2015-02-04 4 views
0

У меня есть C# WebForms приложение, которое использует Linq2SQL, SQL Server, .net 4.5Преобразовать этот SQL запрос в Linq

Я знаю, что SQL достаточно хорошо, но я найти Linq очень тяжелая работа.

SQL хотя сложно, как правило, имеет смысл, но я считаю, что linq практически невозможно писать, если я не могу найти идентичный пример в Интернете. На этот раз я не могу найти его.

Я использую представление в SQL для упрощения процесса и вырезания необходимости в сумасшедшем синтаксисе linq, соединяющем таблицы вместе, однако, поскольку представления не позволят ORDER BY операторов, я немного застрял. Я могу заставить запрос работать отлично в хранимой процедуре, но я отказался от попытки вернуть данные через linq после 5-часового чистки «Сети», чтобы узнать, как это сделать.

оригинальный ORDER BY сортирует Name колонку, но игнорирует "The" в начале поля дает:

Apple 
The Banana 
Orange 
Pear 

Вот является SQL-запрос:

SELECT TOP 100 Name, Year, Data1, Data2 
FROM v_List_Items 
ORDER BY 
    CASE WHEN LOWER(SUBSTRING(Name, 1, 4)) = 'the ' 
      THEN SUBSTRING(Name, 5, len(Name)) 
      ELSE NAME 
    END ASC 

Любые идеи?

Также возможно динамическое изменение фильтра результатов 100.

Благодаря

+0

Вы пытались написать ту же логику в lambda 'OrderBy'? –

+0

@krystanhonour Нет, вопрос в том, как сортировать, исключая префикс ''. – DavidG

+0

Кажется, однако исходный вопрос был плохо сформулирован, я отредактировал, чтобы сделать более четким. –

ответ

3

Я написал следующий SQL-код для вставки в таблицу

INSERT INTO NamedFruit(Name) Values('Apple') 
GO 
INSERT INTO NamedFruit(Name) Values('The Banana') 
GO 
INSERT INTO NamedFruit(Name) Values('Orange') 
GO 
INSERT INTO NamedFruit(Name) Values('Pear') 

используется следующий запрос

NamedFruits.OrderBy(s=>s.Name.StartsWith("The ") ? s.Name.Substring(4) : s.Name); 

результаты:

Apple 
The Banana 
Orange 
Pear 

не должно быть проблемой ,

генерируемый SQL было:

-- Region Parameters 
DECLARE @p0 VarChar(1000) = 'The %' 
DECLARE @p1 Int = 4 
-- EndRegion 
SELECT [t0].[Name] 
FROM [NamedFruit] AS [t0] 
ORDER BY 
    (CASE 
     WHEN [t0].[Name] LIKE @p0 THEN CONVERT(NVarChar,SUBSTRING([t0].[Name], @p1 + 1, CONVERT(Int,DATALENGTH([t0].[Name])))) 
     ELSE CONVERT(NVarChar,CONVERT(NVarChar(20),[t0].[Name])) 
    END) 
+1

Я ненавижу downvotes без комментариев о хорошо написанном ответе, который фактически делает то, о чем попросил оп. Имейте upvote. – Kristof

1

Не уверен, если это будет работать с Ling в SQL, но это должно дать вам начать. Я использую тернарный оператор для определения строки, используемой для сортировки.

var fruits = new List<string> 
{ 
    "Apple", 
    "The Banana", 
    "Orange", 
    "Pear" 
}; 

var orderedFruits = fruits 
    .OrderBy(s => 
     s.StartsWith("The ") 
      ? s.Substring(4) 
      : s); 
0

Вы можете просто выполнить SQL в LINQ, нет необходимости переводить. Например:

Northwnd db = new Northwnd(@"c:\northwnd.mdf"); 
IEnumerable<Customer> results = db.ExecuteQuery<Customer> 
(@"SELECT c1.custid as CustomerID, c2.custName as ContactName 
    FROM customer1 as c1, customer2 as c2 
    WHERE c1.custid = c2.custid" 
); 

Источник: How to: Directly Execute SQL Queries

Это лучше, потому что у вас нет никаких гарантий, что определенная часть LINQ генерирует определенный SQL запрос.

+0

Мальчик, нет.Это не LINQ вообще. И это не отвечает на вопрос. –

+0

Это LINQ2SQL. См. Прикрепленную ссылку, если вы не согласны ... Вы можете связать с ней любой другой оператор LINQ и т. Д. Каким образом это * не * LINQ? – Sklivvz

+1

ORM обычно предоставляют способ выполнения необработанного SQL, но хотя ORM может быть основан на LINQ, * сам оператор * не является LINQ. И вот в чем вопрос. –

Смежные вопросы