C# 操作员'=';无法应用于类型为的操作数

C# 操作员'=';无法应用于类型为的操作数,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,所以我有一个控制器,它实现了对数据库中文件的搜索。用户可以选择按“组织”和“类别”两个字段筛选搜索,也可以将这些下拉菜单保留为“全部” 我有3张桌子要处理: (一) (二) (三) 文件名就是他们要搜索的。为了缩小结果范围,我正在使用文件的镜像数据库并从中删除行: [HttpPost] public ActionResult AssetSearch (string selectedOrgName, string selectedCatName, string searchVal)

所以我有一个控制器,它实现了对数据库中文件的搜索。用户可以选择按“组织”和“类别”两个字段筛选搜索,也可以将这些下拉菜单保留为“全部”

我有3张桌子要处理:

(一)

(二)

(三)

文件名就是他们要搜索的。为了缩小结果范围,我正在使用
文件的镜像
数据库并从中删除行:

    [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();