将此 SQL 查询转换为 Linq

Convert this SQL query into Linq

我有一个使用 Linq2SQL、SQL 服务器、.net 4.5

的 c# webforms 应用程序

我对 SQL 相当了解,但我发现 Linq 非常 很辛苦。

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

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

原始 ORDER BYName 列进行排序,但忽略字段开头的 "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 个结果过滤器也会很有用。

谢谢

我写了下面的sql插入代码到table

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)

不确定这是否适用于 Ling to SQL,但它应该会给你一个开始。我正在使用三元运算符来确定要用于排序的字符串。

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

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

直接在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 查询。