none
Entity Framework:如何支持对枚举属性的查询? RRS feed

  • 问题

  • 场景:

    enum MyEntityType

    {

        Value1,

        Value2,

    }

    class MyEntity

    {

        public int MyEntityTypeId

        {

            get;

            set;

        }

        [NotMapped]

        public MyEntityType MyEntityType

        {

            get

            {

                return (MyEntityType)MyEntityTypeId;

            }

            set

            {

                this.MyEntityTypeId = (int)value;

            }

        }

    }

    问题:

    当我们使用EF查询的时候:

    var query = IQuery<MyEntity>;

    var query = query.Where(x=>x.MyEntityType == MyEntityType.Value1)

    这个查询是会报告错误的,因为MyEntityType不是MyEntity实体的属性(字段)。

    请问如何实现类似的查询?

    此外,如果我在Entity里定义一个long类型作为status,然后通过位的方式读取不同位域的值作为枚举类型的属性,要想查询又该怎么操作?

    谢谢。

    2014年9月2日 9:20

答案

  • Hello,

    >>请问如何实现类似的查询?

    EF不支持在getset这样的操作,你可以直接把枚举字段生成一个数据库列:

    public class MyEntity
    
        {
    
            public int ID { get; set; }
    
            public string Name { get; set; }
    
            public MyEntityType MyEntityType { get; set; }
    
        }
    

    然后这样查询就没问题了:

      var query = db.MyEntity.Where(x => x.MyEntityType == MyEntityType.Value1).ToList();

    >>此外,如果我在Entity里定义一个long类型作为status,然后通过位的方式读取不同位域的值作为枚举类型的属性,要想查询又该怎么操作?

    你是想将long类型的值转成二进制后然对这个二进制变量进行判断?那你需要用ToList吧数据库先load到本地在用Convert.ToString(a, 2)把你的那个long类型的字段转成二进制,因为LINQ2Entities是不支持这个转换方法的,我们要用LINQ2Object:

    var query = db.MyEntity.ToList().Where(x => Convert.ToString(x.MyEntityType, 2) == "111").ToList();

    Regards.


    2014年9月3日 5:51
    版主

全部回复

  • Hello,

    >>请问如何实现类似的查询?

    EF不支持在getset这样的操作,你可以直接把枚举字段生成一个数据库列:

    public class MyEntity
    
        {
    
            public int ID { get; set; }
    
            public string Name { get; set; }
    
            public MyEntityType MyEntityType { get; set; }
    
        }
    

    然后这样查询就没问题了:

      var query = db.MyEntity.Where(x => x.MyEntityType == MyEntityType.Value1).ToList();

    >>此外,如果我在Entity里定义一个long类型作为status,然后通过位的方式读取不同位域的值作为枚举类型的属性,要想查询又该怎么操作?

    你是想将long类型的值转成二进制后然对这个二进制变量进行判断?那你需要用ToList吧数据库先load到本地在用Convert.ToString(a, 2)把你的那个long类型的字段转成二进制,因为LINQ2Entities是不支持这个转换方法的,我们要用LINQ2Object:

    var query = db.MyEntity.ToList().Where(x => Convert.ToString(x.MyEntityType, 2) == "111").ToList();

    Regards.


    2014年9月3日 5:51
    版主
  • who are you?

    what are you saying?

    2014年9月4日 7:09
  • Hello,

    更新了下,论坛貌似有点问题,把回复更新掉了。我重新post了一遍。非常不要意思。

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年9月4日 8:22
    版主
  • 非常感谢!

    1、枚举查询。

    按照你说的方案,我试了下是可以的。但是,数据存储到数据库后,是字符串的形式。

    如果,这个枚举定义的是位域呢?也就是说枚举是定义了 Flags 特性的,这个方案貌似就不可以了。

    2、你这样操作是转换成了object,而用这个方案,会导致把所有的数据都查询出来,就不能利用数据库查询的特性了,而且,这样在数据量大的时候,可是一个大麻烦。

    再次感谢!

    2014年9月26日 8:16