所以我有一个控制器正在实现搜索数据库中的文件。用户可以选择按两个字段“组织”和“类别”过滤搜索,也可以将这些下拉菜单保留为“全部”。
我有3个表可供使用:
(1)
tmdbsimple
(2)
orgs
---------------------
orgid | orgname
(3)
cats
---------------------
orgid | orgname
并且文件名是他们正在搜索的内容。为了缩小结果范围,我正在使用 files
------------------------------------------
fileid | orgid | catid | filename
数据库的镜像并从中删除行:
files
我的第一个问题与我在标题中提到的错误有关。错误指向
[HttpPost]
public ActionResult AssetSearch (string selectedOrgName, string selectedCatName, string searchVal)
{
PortalData PD = new PortalData();
if (selectedOrgName != "All")
{
var selectedOrgId = PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName); // Get the orgid corresponding to the selected organization
if (selectedOrgId == null) return Content("Couldn't find row for organization '" + selectedOrgName + "' in the database."); // Return error message if no such oranization name exists
(from thisfile in PD.orgs where thisfile.orgid != selectedOrgId select thisfile).Delete(); // Delete all rows that don't have an orgid corresponding to the selected organization
} // if search is filtered by a specific organization
if (selectedCatName != "All")
{
var selectedCatId = PD.cats.FirstOrDefault(c => c.catname == selectedCatName); // Get the catid corresponding to the selected category
if (selectedCatId == null) return Content("Couldn't find row for category '" + selectedCatName + "' in the database."); // Return error message if no such organization name exists
(from thisfile in PD.orgs where thisfile != selectedCatId select thisfile).Delete();
} // if search is filtered by a specfic category
和
thisfile.orgid != selectedOrgId
我不确定为什么它不喜欢这些表达式,因为SQL数据库中的thisfile.orgid != selectedCatId
是orgid
s,因此应该是int
返回的值。
我的下一个问题是如何使凌乱的代码更加紧凑,高效,可读和可靠。
(我是C#/ LINQ /等的n00b,所以对我来说很容易!)
答案 0 :(得分:5)
var selectedOrgId = PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName);
将是实体类型“组织”,而不是它的id, 与
相同var selectedCatId = PD.cats.FirstOrDefault(c => c.catname == selectedCatName);
所以你需要选择这样的ID:
var selectedOrgId = PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName).OrgID;
我还建议您检查那里的null,查询的结果
PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName)
不为空
答案 1 :(得分:2)
相信你的selectedCatId仍然是pd.org的一个实例所以我认为你需要说这个文件.id!= selectedCatId.orgid
答案 2 :(得分:0)
两种可能的变化:
您应该将名称更改为selectedOrg,而不是selectedOrgId。
thisfile.orgid != selectedOrg.orgid
您可以更改查询样式
var orgid = (from o in PD.orgs
where o.orgname==selectedOrgName
select o.orgid).FirstOrDefault();
因为这会直接为您提供ID并使用您当前的代码。