首页 > 解决方案 > 不同列的搜索方法

问题描述

FormComboBoxTextBox。第一个包含列名,第二个包含要搜索的文本。作为源,取自ComboBox元素。该方法在按下按钮的过程中被调用。ListTypeSearchItemSearchSearch()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;

        }
    }
}

标签: c#linqpropertiesentity-framework-core

解决方案


根据其他答案。如果 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();
    }
}

推荐阅读