【问题标题】:How to use Enums with Dynamic Linq?如何在动态 Linq 中使用枚举?
【发布时间】:2011-10-27 21:31:09
【问题描述】:

我想在我的动态 LINQ 查询中使用枚举。

有没有可能,如果有,怎么做?

考虑下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Room aRoom = new Room() { Name = "a Room" };
            Room bRoom = new Room() { Name = "b Room" };
            Room cRoom = new Room() { Name = "c Room" };

            House myHouse = new House
            {
                Rooms = new List<Room>(new Room[] { aRoom }),
                MainRoom = aRoom
            };
            House yourHouse = new House()
            {
                Rooms = new List<Room>(new Room[] { bRoom, cRoom }),
                MainRoom = bRoom
            };
            House donaldsHouse = new House()
            {
                Rooms = new List<Room>(new Room[] { aRoom, bRoom, cRoom }),
                MainRoom = aRoom
            };

            var houses = new List<House>(new House[] { myHouse, yourHouse, donaldsHouse });

            // MainRoom.Name = \"a Room\" and Rooms.Count = 3 or 
            // ?????????????????????????
            var aRoomsHouses = houses.AsQueryable<House>().Where("MainRoom.Type = \"RoomType.Kitchen\"");

            Console.WriteLine("aRoomsHouses count = {0}", aRoomsHouses.Count());
            Console.ReadKey();
        }
    }

    public class House
    {
        public string Address { get; set; }
        public double Area { get; set; }
        public Room MainRoom { get; set; }
        public List<Room> Rooms { get; set; }
    }

    public class Room
    {
        public double Area { get; set; }
        public string Name { get; set; }
        public RoomType Type { get; set; }
    }

    public enum RoomType
    {
        Kitchen,
        Bedroom,
        Library,
        Office
    }
}

【问题讨论】:

  • 是否需要使用dynamic-linq。可以使用标准 linq 完成
  • @Dean: ) 我需要动态 linq。

标签: c# .net linq dynamic-linq


【解决方案1】:

另外还有一个变体使用参数

var aRoomsHouses = houses.AsQueryable<House>().Where("MainRoom.Type = @0",RoomType.Kitchen);

【讨论】:

    【解决方案2】:

    要将新的 Enum 类型添加到动态 linq,您必须添加以下代码:

    typeof(Enum),
    typeof(T)
    
    T : Enum type
    

    在预定义的动态类型中 这对我有用;

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题并尝试了@Steve Wilkes 指定的标记答案,但它对我不起作用! 然后我发现动态 LINQ 在同一个包中有一个 HTML 文档,其中提到可以将枚举指定为字符串文字。

      houses.AsQueryable<House>().Where("MainRoom.Type = \"Kitchen\"")
      

      这对我有用。

      【讨论】:

      • 谢谢!以上都不起作用,但使用枚举值名称作为文字效果很好。
      【解决方案4】:

      这应该可以工作

      houses.AsQueryable<House>().Where(rs=>rs.MainRoom.Type == RoomType.Kitchen);
      

      为什么在这种情况下需要动态 linq?你期望什么输出

      根据我的偏好,应避免使用容易出错的字符串。如果您的类或属性名称发生更改,则在遇到错误之前您将无法找到错误。

      宁可使用表达式

          Expression<Func<House, bool>> 
              filter = (p) => p.MainRoom.Type == RoomType.Kitchen; 
              filter = (p) => p.MainRoom.Area > 200;
              filter = (p) => p.Rooms.Sum(rs => rs.Area) > 500;
              filter = (p) => p.Address.Contains("abc");
              filter = (p) => p.Area > 200;
              ...
          var aRoomsHouses = houses.AsQueryable<House>().Where(filter);
      

      您可以创建表达式来决定使用哪个字符串过滤器。最好创建一个静态类,或者可以是 switch 语句,它为您提供不同类型的表达式,您可以将其用作 where 参数。

      【讨论】:

      • 静态链接没办法...我需要动态 linq,因为我根据用户过滤器规范动态构建过滤器。
      • 我认为您没有理由不能通过用户输入执行您使用标准 linq 执行的查询类型。
      • @Andrew,如果用户从组合“厨房”中选择,我需要将其转换为“RoomType.Kitchen”,可能它选择的不是房间类型,但房间面积小于说 30 平方米...所以我需要一个 动态 查询
      • 你被“动态”这个词卡住了。您可以使用标准 linq 进行此类查询
      • @Andrew Barber:使用谓词构建器,您始终可以为每个案例的一部分设置开关,换句话说,您对每个属性进行硬编码,并且在不更改开关代码的情况下添加新属性变得不可能。
      【解决方案5】:

      这行得通:

      houses.AsQueryable<House>()
          .Where("MainRoom.Type = ConsoleApplication2.RoomType.Kitchen")
      

      【讨论】:

      • 第一个不起作用。 'int' 未找到作为 'House' 属性...,由于相同的原因,第二个不起作用...,通常,您不能使用“==”,但“=”。恐怕您还没有测试您的查询...
      • 道歉-你说得对-我从模糊的记忆中写了两个选项...我刚刚测试了两个选项,第一个是不行的,但第二个只有一个等号有效很好,所以我更新了我的答案,只包括那个。
      • 你有理由。您的查询有效,所以,也许这是一个很好的答案。但是,我已经在另一个上发布了:),所以也想知道如何使它工作stackoverflow.com/q/7077056/185593
      • 我也回答了另一个问题 :)
      • 你可以尝试修改这个枚举,看看上面的表达式是否给出了正确的结果?新枚举 : public enum RoomType { Bedroom, Kitchen, // 厨房移到第二个位置 Library, Office }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多