Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中某些参数的排序_C#_Entity Framework_Linq - Fatal编程技术网

C# 实体框架中某些参数的排序

C# 实体框架中某些参数的排序,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个搜索结果表,其中它们是一个列,其中包含可以修改的有限值 "Completed", "Recruiting", "Active and not Recruiting" 我希望先出现“招聘”行,然后是“活动且未招聘”,最后是“完成” 我使用的表达方式是 List<Search> lst = new List<Search>(); var hello = db.tblSomething.Where(em=>em.someid==obj.someid).To

我有一个搜索结果表,其中它们是一个列,其中包含可以修改的有限值

"Completed", "Recruiting", "Active and not Recruiting" 
我希望先出现“招聘”行,然后是“活动且未招聘”,最后是“完成”

我使用的表达方式是

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);   
}
List lst=new List();
var hello=db.tblSomething.Where(em=>em.someid==obj.someid).ToList
foreach(hello中的项目)
{
SomeClass obj1=新的SomeClass();
obj1.Status=hello.Status;
第一次添加(obj1);
}
状态可以包含三个“已完成”、“正在招聘”、“正在招聘”和“未招聘”中的任意一个

首先出现的招聘状态元素的表达式是什么?

使用
List.Sort(Comparison)
方法。根据需要为
搜索定义比较。看见

我希望“招聘”列先出现,然后是“积极和不招聘”,最后是“完成”

使用

publicstaticvoidmain()
{
变量列表=新列表
{
新建SomeClass{Status=“recruving”},
新建SomeClass{Status=“Completed”},
新建SomeClass{Status=“活动且未招募”},
新建SomeClass{Status=“Completed”},
新建SomeClass{Status=“recruving”}
};
打印列表(列表);
控制台。写线(“-”);
var排序=列表
.OrderBy(sc=>sc.Status.Equals(“招聘”,StringComparison.OrdinalIgnoreCase)
? 0
:sc.Status.Equals(“活跃且未招募”,StringComparison.OrdinalIgnoreCase)
1.
:sc.Status.Equals(“已完成”,StringComparison.OrdinalIgnoreCase)
2.
: 3)
.ToList();
打印列表(已排序);
}
公共静态无效打印列表(IEnumerable列表)
{
foreach(列表中的var sc)Console.WriteLine(sc.Status);
}
公共类
{
公共字符串状态{get;set;}
}
结果:

复发

完成

积极和不招募

完成

复发

-

复发

复发

积极和不招募

完成

完成

这一切都很好,但代码非常难看,非常脆弱。相反,我强烈建议使用and

使用系统;
使用System.Linq;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
公共课程
{
公共枚举状态类型
{
[显示(Name=“无效”,顺序=-1)]
无效=0,
[显示(Name=“Receiting”,顺序=0)]
招聘,
[显示(Name=“Completed”,订单=2)]
完整的,
[显示(Name=“活动且未招募”,订单=1)]
主动和非招募
}
公共静态void Main()
{
变量列表=新列表
{
新的SomeClass{Status=StatusType.Recruving,Id=1,Name=“Abraham”},
新建SomeClass{Status=StatusType.Completed,Id=2,Name=“Ben”},
新的SomeClass{Status=StatusType.ActiveAndNotRecluding,Id=3,Name=“Carl”},
新建SomeClass{Status=StatusType.Completed,Id=4,Name=“Dan”},
新建SomeClass{Status=StatusType.Recruving,Id=5,Name=“Erin”}
};
打印列表(列表);
控制台。写线(“-”);
var排序=列表
.OrderBy(cs=>cs.Status.ToDisplay().Order)
.ToList();
打印列表(已排序);
}
公共静态无效打印列表(IEnumerable列表)
{
foreach(列表中的var sc)Console.WriteLine(“{0},{1}是{2}”,sc.Id,sc.Name,sc.Status.ToDisplay().Name);
}
公共类
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共状态类型状态{get;set;}
}
}
公共静态类枚举扩展
{
public static DisplayAttribute ToDisplay(此枚举枚举值)
{
返回enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttributes(false)
.其中(a=>a是DisplayAttribute)
.FirstOrDefault()作为DisplayAttribute;
}
}
结果:

1、亚伯拉罕正在复发

2,本完成了

卡尔很活跃,不招人

4,丹完成了

5,艾琳正在复发

-

1、亚伯拉罕正在复发

5,艾琳正在复发

卡尔很活跃,不招人

2,本完成了

4,丹完成了


使用枚举的优点是,属性和排序的名称被封装到单个逻辑位置。如果您想更改订单,可以在单个位置进行更改,确保所有其他内容都会更改,而不会有任何其他内容中断。这也删除了使用。

如果我的其他属性也在某个类(如id或其他)中,它们也会根据状态位置相应地更改其位置?排序列表是按值排序的对象。它不会更改对象,只是更改列表中的顺序(我将更新示例)。
    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; }  
}
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;
    }
}