9

動的 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
    }
}
4

5 に答える 5

21

私はこの同じ問題に遭遇し、@Steve Wilkes によって指定されたマーク付きの回答を試しましたが、うまくいきませんでした!! 次に、動的 LINQ の同じパッケージに HTML ドキュメントがあり、列挙型を文字列リテラルとして指定できることがわかりました。

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

それは私のために働いた。

于 2012-06-21T08:57:35.703 に答える
4

これは機能します:

houses.AsQueryable<House>()
    .Where("MainRoom.Type = ConsoleApplication2.RoomType.Kitchen")
于 2011-08-16T10:29:54.083 に答える
1

これはうまくいくはずです

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);

使用する文字列フィルターを決定する式を作成できます。静的クラスを作成するか、または where 引数として使用できるさまざまなタイプの式を提供する switch ステートメントを作成することをお勧めします。

于 2011-08-16T10:23:37.857 に答える
-1

新しい列挙型を動的 linq に追加するには、次のコードを追加する必要があります。

typeof(Enum),
typeof(T)

T : Enum type

事前定義された動的タイプでそれは私にとってはうまくいきます。

于 2013-03-22T13:06:10.463 に答える