Tsql T-SQL(按案例排序)到LinQ

Tsql T-SQL(按案例排序)到LinQ,tsql,linq-to-sql,Tsql,Linq To Sql,我有以下声明,我想要一个LINQ等价物: SELECT * FROM People where Name like '%something%' ORDER BY CASE WHEN Name LIKE 'something%' then 1 WHEN Name LIKE '%something%' then 2 ELSE 3 END 基本上,我检索包含一个值的所有行(在本例中为“某物”),并对它们进行排序:首先是以该值开头的行,然后是剩余的行 关于如何在L

我有以下声明,我想要一个LINQ等价物:

SELECT *

  FROM People

  where Name like '%something%'

  ORDER BY CASE 

  WHEN Name LIKE 'something%' then 1

  WHEN Name LIKE '%something%' then 2

  ELSE 3 END
基本上,我检索包含一个值的所有行(在本例中为“某物”),并对它们进行排序:首先是以该值开头的行,然后是剩余的行


关于如何在LinQ中实现这一点,有什么想法吗?

我提出了以下解决方案

var dc = new EntityContext();

var result = dc 
// Condition part
.People.Where(x => x.Name.IndexOf("Foo") > -1) // This part is translated to like
// projection part
.Select(x => new { Person = x, Weight = x.Name.IndexOf("Bar") > -1 ? 1 : (x.Name.IndexOf("Baz") ? 2 : 0)})
// Order
.OrderBy(x => x.Weight)
// Final projection
.Select(x => x.Person);

我想一切都是不言自明的。首先,您根据自己的条件进行选择,然后创建一个具有必要权重的新对象,然后对其进行排序,最后选择必要的人员。

我无法验证这一点,但类似的方法可能会奏效。代码当然可以优化/清理,但理论上这可能会奏效:)

唯一的问题是,可比较委托中的contains是否会像Where中那样进行转换。因此,您可能需要使用IndexOf或类似的(正如Oybek实现的那样)


谢谢你的主意!最后我做了:context.People.Where(p=>p.Name.Contains('something')).OrderBy(f=>f.Name.IndexOf('something')).ThenBy(f=>f.Name.Length).ToList()
var queryResult = 
     people
    .Where(person=>person.name.Contains(@"/something/"))
    .OrderBy(person=>person.Name, 
        delegate(string name1, string name2)
        {
            int result1, result2;
            if(name1.Contains(@"something/")) result1 = 1;
            else if(name1.Contains(@"/something/")) result1 = 2;
            else result1 = 3;

            if(name2.Contains(@"something/")) result2 = 1;
            else if(name2.Contains(@"/something/")) result2 = 2;
            else result2 = 3;

            return result1.CompareTo(result2);
        })