gpt4 book ai didi

c# - 在 Entity Framework 中为某些参数排序

转载 作者:行者123 更新时间:2023-11-30 23:26:10 24 4
gpt4 key购买 nike

我有一个搜索结果表,其中有一个包含有限值的列

"Completed", "Recruiting", "Active and not Recruiting" 

我希望“Recruiting”行排在第一位,然后是“Active and not Recruiting”,最后是“Completed”。

我正在使用的表达式是这样的

List<Search> lst = new List<Search>(); 

var hello = db.tblSomething.Where(em=>em.someid==obj.someid).ToList

foreach(item in hello)
{
SomeClass obj1 = new SomeClass();
obj1.Status = hello.Status;
lst.Add(obj1);
}

Status 可以包含“Completed”、“Recruiting”、“Active and not Recruiting”三个中的任何一个。

Recruiting Status 元素首先出现的表达式是什么?

最佳答案

I want "Recruiting" columns to come first and then "Active and not Recruiting" and at last "Completed".

使用OrderBy .

DotNetFiddle Example .

    public static void Main()
{
var list = new List<SomeClass>
{
new SomeClass{ Status = "Recruiting"},
new SomeClass{ Status = "Completed"},
new SomeClass{ Status = "Active and not Recruiting"},
new SomeClass{ Status = "Completed"},
new SomeClass{ Status = "Recruiting"}
};

PrintList(list);

Console.WriteLine("-");

var sorted = list
.OrderBy(sc => sc.Status.Equals("Recruiting", StringComparison.OrdinalIgnoreCase)
? 0
: sc.Status.Equals("Active and not Recruiting", StringComparison.OrdinalIgnoreCase)
? 1
: sc.Status.Equals("Completed", StringComparison.OrdinalIgnoreCase)
? 2
: 3)
.ToList();


PrintList(sorted);

}

public static void PrintList(IEnumerable<SomeClass> list)
{
foreach(var sc in list) Console.WriteLine(sc.Status);
}

public class SomeClass
{
public string Status { get; set; }
}

结果:

Recuiting

Completed

Active and not Recruiting

Completed

Recuiting

-

Recuiting

Recuiting

Active and not Recruiting

Completed

Completed

这一切都很好,但代码非常丑陋且非常脆弱。相反,我强烈建议使用 EnumDisplayAttribute .

DotNetFiddle Example

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

public class Program
{
public enum StatusType
{
[Display(Name = "Invalid", Order = -1)]
Invalid = 0,
[Display(Name = "Recuiting", Order = 0)]
Recruiting,
[Display(Name = "Completed", Order = 2)]
Completed,
[Display(Name = "Active and not Recruiting", Order = 1)]
ActiveAndNotRecruiting
}


public static void Main()
{
var list = new List<SomeClass>
{
new SomeClass{ Status = StatusType.Recruiting, Id = 1, Name = "Abraham"},
new SomeClass{ Status = StatusType.Completed, Id = 2, Name = "Ben"},
new SomeClass{ Status = StatusType.ActiveAndNotRecruiting, Id = 3, Name = "Carl"},
new SomeClass{ Status = StatusType.Completed, Id = 4, Name = "Dan"},
new SomeClass{ Status = StatusType.Recruiting, Id = 5, Name = "Erin"}
};

PrintList(list);

Console.WriteLine("-");

var sorted = list
.OrderBy(cs => cs.Status.ToDisplay().Order)
.ToList();


PrintList(sorted);

}

public static void PrintList(IEnumerable<SomeClass> list)
{
foreach(var sc in list) Console.WriteLine("{0}, {1} is {2}", sc.Id, sc.Name, sc.Status.ToDisplay().Name);
}

public class SomeClass
{
public int Id { get; set; }
public string Name { get; set; }
public StatusType Status { get; set; }
}
}

public static class EnumExtensions
{
public static DisplayAttribute ToDisplay(this Enum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttributes(false)
.Where(a => a is DisplayAttribute)
.FirstOrDefault() as DisplayAttribute;
}
}

结果:

1, Abraham is Recuiting

2, Ben is Completed

3, Carl is Active and not Recruiting

4, Dan is Completed

5, Erin is Recuiting

-

1, Abraham is Recuiting

5, Erin is Recuiting

3, Carl is Active and not Recruiting

2, Ben is Completed

4, Dan is Completed

使用枚举的优点是属性的名称和排序被封装到一个逻辑位置。如果你想改变顺序,你可以在一个地方这样做,确保其他一切都改变并且没有其他东西会中断。这也删除了 magic numbers/strings 的使用.

关于c# - 在 Entity Framework 中为某些参数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com