【问题标题】:How to pass variableized expressions to .FindAll()?如何将变量化表达式传递给 .FindAll()?
【发布时间】:2017-07-22 16:12:48
【问题描述】:

{High level},我正在尝试回发一个 ASP.NET MVC 视图,该视图具有多个“搜索条件”的“用户输入”,并将这个不同的“搜索条件”用作构造一个控制器操作方法中的参数viewmodel 并通过最终将“用户输入”作为参数传递给该方法的 {Low level} .FindAll() 从 viewmodel 的方法中获取结果。需要用户能够使用一个或多个或所有输入作为他们的搜索条件。例如:用户想要搜索以“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[] 的示例,但仍然没有解决根据用户是否从视图中提供表达式来添加或不添加表达式的问题。

我做错了吗?我的意思是有更简单的方法吗?

【问题讨论】:

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


    【解决方案1】:

    我放弃了尝试让 .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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2013-05-15
      相关资源
      最近更新 更多