创建一个func以便更好地进行查询搜索

时间:2014-08-07 13:54:47

标签: c# func

我非常擅长使用delegates和func编写c#。一小时前直接观看了一个多视频视频。

我正在尝试编写一个函数,允许我编写一个灵活的方法,使用EF和IQueryable在我的mvc应用程序中构建Where子句

尝试解释我以为我会写一个小例子,我想作为控制台应用程序做什么

public static void Main(string[] args)
    {
        var city1 = new ArgsSearch() {Address = "city1"};
        var city2 = new ArgsSearch() { Address = "city2" };
        var city1Dealers = DummyDealers().Where(GenerateSearchCriteria<CarDealer>(city1)).ToList();
        var city2Dealers = DummyDealers().Where(GenerateSearchCriteria<CarDealer>(city2)).ToList();

        foreach (var carDealer in city1Dealers)
        {
            Console.WriteLine(carDealer.Name);
        }
        Console.WriteLine("_______________________________________");

        foreach (var carDealer in city2Dealers)
        {
            Console.WriteLine(carDealer.Name);
        }
        Console.WriteLine("_______________________________________");
    }

    public static List<CarDealer> DummyDealers()
    {
        return new List<CarDealer>()
        {
            new CarDealer() {Address = "city1", Id = 1, Name = "name1"},
            new CarDealer() {Address = "city1", Id = 2, Name = "name2"},
            new CarDealer() {Address = "city2", Id = 3, Name = "name3"},
            new CarDealer() {Address = "city2", Id = 4, Name = "name4"}
        };
    }


    public static Func<TSearch, bool> GenerateSearchCriteria<TSearch>(ArgsSearch args) where TSearch : IBaseModel
    {

        if (this.GetType() == typeof(CarModel))
        {
            //return
            return e => e.Name == args.Name;// && e.Cost == args.Cost;
        }
        if (GetType() == typeof(CarDealer))
        {
            return e => e.Name == args.Name;// && e.Address == args.Address;
        }
        return e => e.Name==args.Name;

    }


    public class ArgsSearch
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public decimal Cost { get; set; }
    }

我走的是正确的轨道吗?我怎么知道TSearch是CarModel还是CarDealer?允许我应用自定义搜索值。

感谢您的任何建议和任何帮助将非常感谢!

1 个答案:

答案 0 :(得分:0)

你需要施放:

(警告:未来的丑陋代码)

    if (typeof(TSearch) == typeof(CarModel))
    {
        //return
        return e => e.Name == args.Name && ((CarModel)(object)e).Cost == args.Cost;
    }
    if (typeof(TSearch) == typeof(CarDealer))
    {
        return e => e.Name == args.Name && ((CarDealer)(object)e).Address == args.Address;
    }
    return e => e.Name==args.Name;