试图获取存储过程的值 - 错误:“不包含定义”

时间:2011-07-17 17:44:48

标签: sql sql-server linq linq-to-sql stored-procedures

ALTER procedure FullSearch(@sumeryFieldOnly as bit,@allPropertyCompany as bit,@txtSearc as nvarchar(200)) 
as 
begin
if @sumeryFieldOnly=1
begin
    select SummaryField,NameCompany,idCompany from propertyCompany where SummaryField like '%'+@txtSearch+'%'
end
if @allPropertyCompany =1 
begin
        select IdCompany, NameCompany,Manager,CenterOfficeAddress,CompanyAddress,Website,EmailCompany,Tel1,Tel2,Country,Province,City,WorkExperience,ResumeManager,HistoryCompany,DescriptionField,SummaryField,'MainPP.aspx?idCompany='+cast(IdCompany as nvarchar(20)) as URL
        from PropertyCompany
        where   NameCompany like '%'+@txtSearch+'%' or Manager like '%'+@txtSearch+'%' or CenterOfficeAddress like '%'+@txtSearch+'%' or CompanyAddress like '%'+@txtSearch+'%' or Website like '%'+@txtSearch+'%' or EmailCompany like '%'+@txtSearch+'%' or Tel1 like '%'+@txtSearch+'%' or Tel2 like '%'+@txtSearch+'%' or Country like '%'+@txtSearch+'%' or Province like '%'+@txtSearch+'%' or City like '%'+@txtSearch+'%' or WorkExperience like '%'+@txtSearch+'%' or ResumeManager like '%'+@txtSearch+'%' or HistoryCompany like '%'+@txtSearch+'%' or DescriptionField like '%'+@txtSearch+'%' or SummaryField like '%'+@txtSearch+'%'
end

end

LINQ

     var result = dc.FullSearch(true,false,"abc");
    foreach (var item in result){
        str +=item.SummaryField;
    }

str工作正常并显示SummaryField

BUT

var result = dc.FullSearch(false,true,"abc");
    foreach (var item in result){
        str +=item.idCompany;
    }

返回错误:

  

错误:'FullSearchResult'不包含。的定义   'IdCompany'并没有扩展方法'IdCompany'接受第一个   可以找到“FullSearchResult”类型的参数(你错过了吗?   使用指令或程序集引用?)

2 个答案:

答案 0 :(得分:2)

此处存在区分大小写问题。

在您的SP中,您有两个选择语句。在一个中,您返回idCompany,在另一个中,您返回IdCompany

如果您在SP中修复它,它可能会正常工作。

C#区分大小写;为SP的结果创建一个类,因此如果大写中存在歧义,则可能出现问题。

答案 1 :(得分:2)

您将根据参数值返回不同形状的结果集。

您看到此异常,因为LINQ To SQL将结果集映射到类FullSearchResult。在设计时,已确定FullSearch的结果集包含第一个选择语句中的属性/列:SummaryFieldNameCompany,{{1 }}

在运行时,您尝试将更多列/属性加载到结果类中。如果不是idCompany抛出错误,那就是IdCompany,依此类推。

建议您将存储过程重构为:

    无论输入是什么,
  • 都会返回可预测的,一致形状的结果集。
  • 为“最宽”的结果集创建/定义表变量。
  • 在您的分支中,插入该表变量。
  • 在存储过程结束时从表中选择所有列。