将此SQL查询转换为Linq

时间:2015-02-04 00:19:31

标签: c# asp.net sql-server linq

我有一个使用Linq2SQL,SQL Server,.net 4.5

的c#webforms应用程序

我非常了解SQL,但我发现Linq 非常努力工作。

SQL尽管棘手通常是有道理的,但我发现linq几乎不可能写,除非我能在网上找到相同的例子。这次我找不到一个。

我在SQL中使用一个视图来简化过程,并且不再需要疯狂的linq语法将表连接在一起,但是由于视图不允许ORDER BY语句,我有点卡住了。我可以让查询在存储过程中完美地工作,但是我放弃了尝试通过5小时搜索网络后通过linq获取数据以找出方法。

原始ORDER BYName列进行排序,但忽略了"""在场地开始时给出:

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个结果过滤器。

由于

3 个答案:

答案 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 :(得分:1)

不确定这是否适用于Linq to SQL,但它应该为您提供一个开始。我正在使用三元运算符来确定用于排序的字符串。

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

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

答案 2 :(得分:0)

您可以在LINQ中执行SQL,无需翻译。例如:

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查询。