Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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# 如何将枚举与动态Linq一起使用?_C#_.net_Linq_Dynamic Linq - Fatal编程技术网

C# 如何将枚举与动态Linq一起使用?

C# 如何将枚举与动态Linq一起使用?,c#,.net,linq,dynamic-linq,C#,.net,Linq,Dynamic Linq,我想在动态LINQ查询中使用枚举 是否可能,如果可能,如何实现 考虑下面的代码: using System; using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic; namespace ConsoleApplication2 { class Program { static void Main(string[] args) {

我想在动态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
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Linq.Dynamic;
命名空间控制台应用程序2
{
班级计划
{
静态void Main(字符串[]参数)
{
Room aRoom=新房间(){Name=“a房间”};
房间扫帚=新房间(){Name=“b房间”};
Room cRoom=new Room(){Name=“c Room”};
房子我的房子=新房子
{
房间=新列表(新房间[]{aRoom}),
主控室
};
房子你的房子=新房子
{
房间=新列表(新房间[]{bRoom,cRoom}),
主房间=扫帚
};
donaldsHouse=新房子()
{
房间=新列表(新房间[]{aRoom,bRoom,cRoom}),
主控室
};
var houses=新列表(新房子[]{myHouse,yourHouse,donaldsHouse});
//MainRoom.Name=\'a Room\'和Rooms.Count=3或
// ?????????????????????????
var aRoomsHouses=houses.AsQueryable().Where(“MainRoom.Type=\”RoomType.Kitchen\”);
WriteLine(“aRoomsHouses count={0}”,aRoomsHouses.count());
Console.ReadKey();
}
}
公屋
{
公共字符串地址{get;set;}
公共双区{get;set;}
公共房间主控室{get;set;}
公共列表室{get;set;}
}
公共教室
{
公共双区{get;set;}
公共字符串名称{get;set;}
公共RoomType类型{get;set;}
}
公共枚举类型
{
厨房,
卧室,
图书馆,
办公室
}
}
这应该行得通

houses.AsQueryable<House>().Where(rs=>rs.MainRoom.Type == RoomType.Kitchen);
houses.AsQueryable().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);
表达式
过滤器=(p)=>p.MainRoom.Type==RoomType.Kitchen;
过滤器=(p)=>p.MainRoom.Area>200;
过滤器=(p)=>p.Rooms.Sum(rs=>rs.Area)>500;
过滤器=(p)=>p.Address.Contains(“abc”);
过滤器=(p)=>p.面积>200;
...
var aRoomsHouses=houses.AsQueryable().Where(过滤器);
您可以创建表达式,在其中决定使用哪个字符串筛选器。最好创建一个静态类或可能是switch语句,它为您提供了不同类型的表达式,您可以将其用作where参数。

这样做:

houses.AsQueryable<House>()
    .Where("MainRoom.Type = ConsoleApplication2.RoomType.Kitchen")
houses.AsQueryable()
.Where(“MainRoom.Type=控制台应用程序2.RoomType.Kitchen”)

我遇到了同样的问题,并尝试了@Steve Wilkes指定的标记答案,但对我无效!! 然后我发现DynamicLinq在同一个包中有一个HTML文档,其中提到可以将枚举指定为字符串文本

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

这对我很有用。

要向动态linq添加新的枚举类型,必须添加以下代码:

typeof(Enum),
typeof(T)

T : Enum type
在预定义类型的动态
这是我的工作

此外,还有另一个变量使用参数

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

您需要使用动态linq吗。这可以用标准的方法来完成linq@Dean:)我需要动态linq。静态链接没有办法。。。我需要动态linq,因为我根据用户过滤器规范动态构建过滤器。我认为没有理由不能从用户输入中使用标准linq进行查询。@Andrew,如果用户从组合“Kitchen”中选择,我需要将其转换为“RoomType.Kitchen”,可能它选择的不是房间类型,但是房间面积应该小于30平方米。。。所以我需要一个动态查询你被“动态”这个词卡住了。您可以使用标准linq@AndrewBarber:使用谓词生成器,您总是为每种情况下的一个零件设置开关,换句话说,您对每个属性进行硬编码,如果不更改开关代码,就不可能添加新属性。第一个开关不起作用。”int'未作为'House'属性找到…,第二个不起作用,因为相同的原因…,通常,您不能使用“==”,而是“=”。恐怕你还没有测试你的查询…抱歉-你说得很对-我从模糊的记忆中写了两个选项。。。我刚刚测试了两个,第一个是不允许的,但是第二个有一个等号,效果很好,所以我更新了我的答案,只包括那个。你有理由。您的查询是有效的,因此,这可能是一个很好的答案。然而,我已经在另一个上发布了:),所以也在想如何使它工作我也回答了另一个:)您能尝试修改这个枚举,看看上面的表达式是否给出了正确的结果吗?新枚举:公共枚举RoomType{卧室,厨房,//厨房移到第二位置图书馆,办公室}谢谢!以上这些都不起作用,但使用枚举值名称作为文字效果很好。