Tsql T-SQL(按案例排序)到LinQ
我有以下声明,我想要一个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
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);
})