C# 操作员'=';无法应用于类型为的操作数
所以我有一个控制器,它实现了对数据库中文件的搜索。用户可以选择按“组织”和“类别”两个字段筛选搜索,也可以将这些下拉菜单保留为“全部” 我有3张桌子要处理: (一) (二) (三) 文件名就是他们要搜索的。为了缩小结果范围,我正在使用C# 操作员'=';无法应用于类型为的操作数,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,所以我有一个控制器,它实现了对数据库中文件的搜索。用户可以选择按“组织”和“类别”两个字段筛选搜索,也可以将这些下拉菜单保留为“全部” 我有3张桌子要处理: (一) (二) (三) 文件名就是他们要搜索的。为了缩小结果范围,我正在使用文件的镜像数据库并从中删除行: [HttpPost] public ActionResult AssetSearch (string selectedOrgName, string selectedCatName, string searchVal)
文件的镜像
数据库并从中删除行:
[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数据库中的orgid
s是int
s,并且PD.orgs.FirstOrDefault(o=>o.orgname==selectedOrgName)返回的值也应该是
我的下一个问题是如何使上面的凌乱代码更加紧凑、高效、可读和可靠
(我是从n00b到C#/LINQ/等的人,所以对我放松点!)
将是实体类型的“组织”,而不是其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)
不为空请相信您选择的CATID仍然是pd.org的实例,因此我认为您需要说thisfile.orgid!=选择CATID.orgid有两种可能的更改:
您可能应该将名称更改为selectedOrg,而不是selectedOrgId
thisfile.orgid != selectedOrg.orgid
您可以更改查询样式
var orgid = (from o in PD.orgs
where o.orgname==selectedOrgName
select o.orgid).FirstOrDefault();
因为这将直接为您提供id并使用当前代码。左侧和右侧的数据类型是什么?我猜您正在尝试比较字符串值和数字值,但是您发布的代码不清楚您使用的数据类型。@Fired:我的下一个问题是如何使上面的凌乱代码更加紧凑、高效、可读和可靠。这太宽泛了,我认为“紧凑、高效、可读和可靠”前两个通常直接与后两个不一致。在我看来,您的目标应该是首先使代码可靠,其次是可读,只有在对代码进行基准测试以确定特定瓶颈后,您才需要担心效率。@JasonWatkins尽管不可读的可靠代码很容易变成不可读的不可靠代码(无论如何,当测试不足时)。。虽然我不能说正确的/工作的/可靠的代码“是最重要的”,但在大多数情况下,可读性/可维护性应该与其他代码并驾齐驱。@user2864740这就是为什么您应该努力始终拥有可读和可靠的代码!但如果你必须在可靠但不可读和不可靠但可读之间做出选择,我很难为后者辩护。
var selectedCatId = PD.cats.FirstOrDefault(c => c.catname == selectedCatName);
var selectedOrgId = PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName).OrgID;
PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName)
thisfile.orgid != selectedOrg.orgid
var orgid = (from o in PD.orgs
where o.orgname==selectedOrgName
select o.orgid).FirstOrDefault();