Tôi cố gắng thực hiện bộ lọc động người dùng, nơi được sử dụng chọn một số thuộc tính, chọn một số toán tử và chọn cũng là giá trị.Biểu thức động bằng LINQ. Làm thế nào để tìm nhà bếp?
Vì tôi chưa tìm thấy câu trả lời cho this question, tôi đã cố gắng sử dụng các biểu thức LINQ.
Chủ yếu là tôi cần phải xác định tất cả các nhà mà phòng chính là nhà bếp (bất kỳ cảm giác nào, tôi biết).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
//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 });
//var kitchens = houses.AsQueryable<House>().Where("MainRoom.Type = RoomType.Kitchen");
//Console.WriteLine("kitchens count = {0}", kitchens.Count());
var houseParam = Expression.Parameter(typeof(House), "house");
var houseMainRoomParam = Expression.Property(houseParam, "MainRoom");
var houseMainRoomTypeParam = Expression.Property(houseMainRoomParam, "Type");
var roomTypeParam = Expression.Parameter(typeof(RoomType), "roomType");
var comparison = Expression.Lambda(
Expression.Equal(houseMainRoomTypeParam,
Expression.Constant("Kitchen", typeof(RoomType)))
);
// ???????????????????????? DOES NOT WORK
var kitchens = houses.AsQueryable().Where(comparison);
Console.WriteLine("kitchens count = {0}", kitchens.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
}
}
Tôi cần truy vấn * động *. Truy vấn này là một truy vấn tĩnh. Nếu người dùng sẽ chọn thuộc tính khác thay vì "Loại" của phòng, phương pháp của bạn sẽ được cập nhật ... loại RoomType là Kitchen (0) theo mặc định. – serhio
nhận xét tốt. Bây giờ ngoại lệ thời gian chạy là "Loại đối số không khớp" khi xây dựng "so sánh". PS. Không cần phải "biên dịch" một ưu tiên ... – serhio
@serhio Kiểm tra xem điều này có phù hợp với bạn hay không. – Vladimir