Linq to sql 查询从数据库返回SQL表达式而不是值?

Linq to sql 查询从数据库返回SQL表达式而不是值?,linq-to-sql,casting,Linq To Sql,Casting,我在数据库的表中有一个整数列,我想选择它,但它给了我一个无法从int转换为string的异常 示例我想从Category表中选择CategoryID,其中CategoryName=“Cat” categoryID是int&categoryName是string 我尝试的linq查询 string Category_ID = (from p in StaticVa.new_data_context.Categories where p.C

我在数据库的表中有一个整数列,我想选择它,但它给了我一个无法从int转换为string的异常

示例我想从
Category
表中选择
CategoryID
,其中
CategoryName=“Cat”

categoryID
是int&
categoryName
是string

我尝试的linq查询

string Category_ID = (from p in StaticVa.new_data_context.Categories
                              where p.CategoryName == Category_Name
                              select p.CategoryID).ToString();
它返回了
“选择[t0].[CategoryID]\r\n从[dbo].[Category]中选择[t0].[CategoryName]=@p0\r\n”

试试看

int Category_ID = (from p in StaticVa.new_data_context.Categories
                              where p.CategoryName == Category_Name
                              select p.CategoryID).FirstOrDefault();
LINQ试图返回与where子句匹配的每个id的IQueryable,如果您只需要一个id,则需要将其指定为single或first

(from p in StaticVa.new_data_context.Categories
                              where p.CategoryName == Category_Name
                              select p.CategoryID)
表示一个表达式,该表达式在执行时将返回一组项

所以你说:

var catIds = (from p in StaticVa.new_data_context.Categories
                              where p.CategoryName == Category_Name
                              select p.CategoryID);
然后通过以下方法获得第一个表达式的值(即强制执行上述表达式并开始返回值):

如果没有返回第一行,则需要使用
int?
,在这种情况下
FirstOrDefault()
将返回空值

但是,如果您确定它至少返回一行,那么您可以说

int Category_ID = catIds.First();
int Category_ID = catIds.Single();
如果你确定它只返回一行,那么你可以说

int Category_ID = catIds.First();
int Category_ID = catIds.Single();

您可以发布一些简短的代码吗?您当前的代码将生成SQL语句-它尚未获取任何数据!您需要对表达式调用
.First()
.FirstOrDefault()
.ToList()
,才能对其进行实际计算(对数据库运行查询如果在数据库中找不到
Category\u Name
会发生什么?如何将
null
值分配给
int
变量?@marc\u公平点,我想我应该将其设置为可为null的int,尽管如果不存在,它默认为0@marc_s其默认值或非默认值或
null
所以
default(int)
0
不是
null
@marc\u有趣的是,我有一个测试应用程序,它可以工作,你的int字段可以为null吗?对不起-我的错-我的测试应用程序显式转换为
int?
-它可以按照你的编码方式工作!我不知道Linq转换为SQL会“自动”将
.FirstOrDefault()
中的
null
转换为
默认值(int)
-谢谢!您的第一条语句并不完全正确-此代码还没有返回任何内容!它只是建立了一个表达式,可以执行…但只有在调用
.FirstOrDefault()
.ToList()时才会执行它
在上面