c# - 不同列的搜索方法
问题描述
我Form
有ComboBox
和TextBox
。第一个包含列名,第二个包含要搜索的文本。作为源,取自ComboBox
元素。该方法在按下按钮的过程中被调用。ListTypeSearch
ItemSearch
Search()
Search
如果给列一个这样的名字,什么都找不到
EF.Functions.Like(item.Value, ...); // Value = "FullName"
如果从模型中指定一列,则搜索有效
EF.Functions.Like(w.FullName, ...);
是否可以替换应在同一Search()
方法中搜索的列?
ListTypeSearch.Add(new ItemSearch { Value = "FullName", Display = "some text" });
ListTypeSearch.Add(new ItemSearch { Value = "PassportSeries", Display = "some text" });
ListTypeSearch.Add(new ItemSearch { Value = "PassportNumber", Display = "some text" });
public class ItemSearch
{
public string Value { get; set; }
public string Display { get; set; }
}
internal List<WorkerTableRow> Search(ItemSearch item, string text)
{
try
{
Found = new List<WorkerTableRow>();
using (ModelContext model = new ModelContext())
{
Found = (from w in model.Workers
where EF.Functions.Like(w.FullName, // this code
String.Format("%{0}%", text))
select new WorkerTableRow
{
...
})
.ToList();
}
}
catch (Exception ex) { ... }
return Found;
}
更新
现在我确实喜欢这个。其作品。这可以简化吗?
where EF.Functions.Like(w.GetProperty(item.Value),
String.Format("%{0}%", text))
public partial class Workers
{
...
public string FullName { get; set; }
public string PassportSeries { get; set; }
public string PassportNumber { get; set; }
public string GetProperty(string name)
{
switch (name)
{
case "FullName":
return FullName;
case "PassportSeries":
return PassportSeries;
case "PassportNumber":
return PassportNumber;
default:
return string.Empty;
}
}
}
解决方案
根据其他答案。如果 uses Like(w.GetProperty(item.Value), ...)
,则请求在客户端而不是服务器上执行。要将整个请求发送到服务器,您可以执行以下操作:
List<WorkerTableRow> Search(ItemSearch item, string text)
{
string pattern = string.Format("%{0}%", text);
using (var model = new ModelContext())
{
IQueryable<Worker> query = model.Workers;
if (item.Value == "FullName")
query = query.Where(w => EF.Functions.Like(w.FullName, pattern));
if (item.Value == "PassportSeries")
query = query.Where(w => EF.Functions.Like(w.PassportSeries, pattern));
if (item.Value == "PassportNumber")
query = query.Where(w => EF.Functions.Like(w.PassportNumber, pattern));
return query.Select(w => new WorkerTableRow { ... }).ToList();
}
}
推荐阅读
- mysql - 每次我登录时都会收到 CANNOT POST /login
- android - Android Firebase OnCompleteListener 不工作
- c# - 在 C# 中使用计时器重复对每个目录重复方法调用
- php - 如何从字符串中获取href值
- python - python中read_text的用途和目的是什么
- java - 项目构建错误:不可解析的 POM /pom.xml:实体引用名称不能包含字符 ='(位置:已看到 START_TAG ...)
- c# - UWP VisualStateManager.GotoState 无法正常工作
- python - 比较列表中元组的第二个元素
- python - 如何更改 Spyder Python 版本
- mod-rewrite - mod_rewrite 正在将多个请求发送回 Lucee 服务器