如何将变量表达式传递给.FindAll()?

时间:2017-07-22 16:12:49

标签: c# asp.net asp.net-mvc delegates

{高级},我试图回发一个ASP.NET MVC视图,它有多个用户输入' "搜索条件"并使用这种不同的搜索条件"作为Controller动作方法中的参数,它构造一个视图模型,并通过最终传递用户输入来获取视图模型方法的结果。作为该方法的参数{低级} .FindAll()。需要用户能够使用一个或多个或所有输入作为其搜索条件。例如:用户想要搜索有" John"作为[CustFName]。另一个例子:用户想要搜索同时拥有" John"作为[CustFName]和" Holmes"作为[CustLName]。

public class SearchTitleViewModel
    {
        private readonly ApplicationDbContext _db = new ApplicationDbContext();

        public SearchTitleViewModel()
        {
            var tits = _db.Titles.ToList();
        }

        public Title Title { get; set; }
        public List<Title> Titles { get; set; }

        public SearchTitleViewModel GetTitlesWithSearchCriteria(string office, bool? mv = null, int id = -1, string custFName = null, string custLName = null, string vin = null)
        {
            SearchTitleViewModel searchtitlevm = new SearchTitleViewModel();

            if (id > -1)
            {
                searchtitlevm.Title = _db.Titles.Find(id);
                searchtitlevm.Titles.Add(searchtitlevm.Title);

                return searchtitlevm;
            }

            searchtitlevm.Titles.AddRange(
                Titles.FindAll(
                    tit => tit.CustFName == custFName && // want to make "tit.CustFName == custFName" a variable
                           tit.CustLName == custLName &&// want to make "tit.CustFName == custFName" a variable
                           tit.InitialLocation == office
                )
            );

            return searchtitlevm;
        }
    }

最终我想将多个lambda表达式传递给.FindAll()作为变量,这些变量在运行时声明为FindAll(Title tit, param1 custFNameExpression, param2 custLNameExpression, ...),但未能找到任何示例来执行此类操作。我确实找到了创建delegate[]的示例,但仍未解决添加表达式的问题,具体取决于用户是否从视图中提供了表达式。

我是否认为这一切都错了?我的意思是有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

我放弃了尝试使.FindAll()为我需要的东西工作。我使用.SqlQuery()代替:

public class SearchTitleViewModel
{
    private readonly ApplicationDbContext _db = new ApplicationDbContext();

    public SearchTitleViewModel()
    {
        Title = new Title()
        {
            NtyId = 1//for testing REMOVE
        };
        Titles = new List<Title>();
    }

    public Title Title { get; set; }
    public List<Title> Titles { get; set; }

    public SearchTitleViewModel GetTitlesWithSearchCriteria(SearchTitleViewModel vm)
    {
        var searchtitlevm = new SearchTitleViewModel();

        if (vm.Title.TitleNum != null)
        {
            searchtitlevm.Title = _db.Titles.Find(vm.Title.TitleNum);
            if (searchtitlevm.Title != null && searchtitlevm.Title.NtyId != vm.Title.NtyId)
            {
                return searchtitlevm;
            }

            searchtitlevm.Titles.Add(searchtitlevm.Title);                
            return searchtitlevm;
        }

        var titssql = "SELECT * FROM Titles WHERE";
        if (vm.Title.Vin != null) { titssql += $" Vin = \'{vm.Title.Vin}\' AND "; }
        if (vm.Title.CustLName != null) { titssql += $" CustLName = \'{vm.Title.CustLName}\' AND "; }
        if (vm.Title.CustFName != null) { titssql += $" CustFName = \'{vm.Title.CustFName}\' AND "; }
        titssql += $" NtyId = \'{vm.Title.NtytyId}\'";

        searchtitlevm.Titles = _db.Titles.SqlQuery(titssql).ToList();

        return searchtitlevm;
    }
}
相关问题