LinQ的T-SQL(按案例排序)

时间:2012-03-01 17:25:28

标签: 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

基本上,我正在检索包含值的所有行(在本例中为'something')并且我正在对它们进行排序:首先是以该值开头的行,然后是剩余的行。

关于如何在LinQ中做到这一点的任何想法?

2 个答案:

答案 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);
        })