使用Table< tenty >的正确算法是什么?和LINQ来过滤搜索
本文关键字:是什么 LINQ 搜索 过滤 算法 Table tenty 使用 | 更新日期: 2023-09-27 17:49:33
我将解释我的设置。我有一个像
这样的表 fileid | orgid | catid | fname
------------------------------------------------------------------------------------------------------------------
1 | 2 | 1 | "mypowerpoint.ppt"
2 | 7 | 12 | "someworddoc.docx"
3 | 4 | 8 | "homepageimg.jpg"
4 | 9 | 4 | "some_text_document.txt"
和两个相关联的表,如
catid | orgid | catname
-------------------------------------------------
1 | 1 | "Some Category"
2 | 1 | "Some other Category"
3 | 2 | "Category XYZ"
4 | 3 | "My category"
和
orgid | orgname
----------------------------------
1 | Company A
2 | Company B
3 | Company C
4 | Company D
有了这些在后台,用户应该过滤他们搜索的文件名(fname
),如果他们这样选择的话。搜索检查他们放置的搜索是否包含在任何文件名中。他们可以通过组织和/或类别过滤他们的搜索。这些过滤器都以下拉列表的形式出现,如果他们不使用过滤器,他们会选择"全部"。它们的搜索结果以HTML表的行形式返回。
这是我的方法,返回那些搜索结果:
public ActionResult Search (string selectedOrgName, string selectedCatName, string searchVal)
{
PortalData PD = new PortalData();
string htmlRows = "";
foreach (AssetFile f in PD.files)
{
if (f.filename.Contains(searchVal))
{
string fOrgName = PD.orgs.FirstOrDefault(o => o.orgid == f.orgid).orgname;
string fCatName = PD.cats.FirstOrDefault(c => c.catid == f.catid).catname;
if ( (selectedOrgName == "ALL" || fOrgName == selectedOrgName)
&& (selectedCatName == "ALL" || fCatName == selectedCatName) )
{
htmlRows += "<tr>" + "<td><input type='"checkbox'"/></td><td>" + fOrgName + "</td><td>" + fCatName + "</td><td>" + f.filename + "</td></tr>";
}
}
}
if (string.IsNullOrEmpty(htmlRows)) htmlRows = "No results found!";
return Content(htmlRows, "text/html");
}
问题是,如果我将来要添加新的过滤器,它看起来非常丑陋,可能效率低下,绝对无法扩展。我想知道做这件事的正确方法是什么。
我会先解决我的评论,但对于查询,尝试如下:
IQueryable<myTable> PortalData;
// here is your first search / filter
PortalData = PortalData.Where(x => x.filename.contains(q));
// here is later future filters
// just an example of another filter on top of first one
PortalData = PortalData.Where(x => x.Id < whatever)
return PortalData.Select(x => new { x.orgName , x.catName });