我有以下声明,我希望有一个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
基本上,我正在检索包含值的所有行(在本例中为'something')并且我正在对它们进行排序:首先是以该值开头的行,然后是剩余的行。
关于如何在LinQ中做到这一点的任何想法?
答案 0 :(得分:3)
我推出了以下解决方案。
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);
我想一切都是自我解释的。首先根据您的条件选择,然后创建一个具有必要权重的新对象,然后对其进行排序,最后选择必要的人员。
答案 1 :(得分:0)
我无法验证这一点,但这样的事情可能有效。代码肯定可以优化/清理,但理论上这可能会起作用:)
唯一的问题是,可比代表中的包含是否会转换它在Where中的方式。因此,您可能需要使用IndexOf或类似的(如Oybek实现的)
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);
})