这种事情一直困扰着我,所以我想我应该从你们这些聪明的人那里寻找一种“更好的方式”。
我有一个查询,我想返回单个字段的值,它是一个int值。
int thivalue = (from q in context.tablename
where q.ID == id
orderby q.fieldname descending
select q).FirstOrDefault().fieldname;
问题是查询可能不返回任何结果,在这种情况下,我希望此值为0。
当然,如果没有结果,我将尝试访问不存在的字段时遇到异常。因此,似乎我的选择是a)返回该行(我不需要),以便我可以测试null并从那里去,或者b)将try换行并将其设置为0,在那里似乎有点笨拙。
我以为DefaultIfEmpty()可能对我有帮助,但是如果我想要的只是以单个值结束,似乎没有帮助。
那么执行此操作的正确方法是什么?当我只需要一个值时,是否只是想不想返回整行?
附录:(如果有人有兴趣)
伯克利兄弟公司在他的回答中给了我两个明显相同的选择。但是只有第二个给了我正确的结果。OrderByDescending似乎有些问题。使用Glimpse,我查看了每个查询。
var nextSequence = db.PaneContents
.Where(q=>q.QuizPaneID == quizPaneId)
.OrderByDescending(q=>q.Sequence)
.Select (q=>q.Sequence)
.DefaultIfEmpty()
.First();
产生此查询:
SELECT
CASE WHEN ([Limit1].[C1] IS NULL) THEN 0 ELSE [Limit1].[Sequence] END AS [C1]
FROM ( SELECT TOP (1)
[Project1].[Sequence] AS [Sequence],
[Project1].[C1] AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN (SELECT
[Extent1].[Sequence] AS [Sequence],
cast(1 as tinyint) AS [C1]
FROM [dbo].[PaneContents] AS [Extent1]
WHERE [Extent1].[QuizPaneID] = 274 /* @p__linq__0 */ ) AS [Project1] ON 1 = 1
) AS [Limit1]
而
var nextSequence = (from q in db.PaneContents
where q.QuizPaneID == quizPaneId
orderby q.Sequence descending
select q.Sequence).FirstOrDefault();
产生此查询:
SELECT TOP (1)
[Project1].[Sequence] AS [Sequence]
FROM ( SELECT
[Extent1].[Sequence] AS [Sequence]
FROM [dbo].[PaneContents] AS [Extent1]
WHERE [Extent1].[QuizPaneID] = 274 /* @p__linq__0 */
) AS [Project1]
ORDER BY [Project1].[Sequence] DESC
看起来在第一个示例中,OrderByDescending()在某种程度上迷失了翻译?无论如何,出于我的目的,不需要DefaultIfEmpty(),第二个示例更加简单。我只是以为它不起作用很奇怪(通过“没有作用”,我是指它选择了错误的值,因为它没有按降序排列),因为它看起来应该正确。
如果我对您的理解正确,则可以尝试以下操作:
int thisvalue = context.tablename
.Where(q => q.ID == id)
.OrderByDescending(q => q.fieldname)
.Select(q => q.fieldname)
.FirstOrDefault();
要么
int thisvalue = (from q in context.tablename
where q.ID == id
orderby q.fieldname descending
select q.fieldname).FirstOrDefault();
在调用FirstOrDefault()之前选择q.fieldname将使SQL仅返回第一项字段名(而不是整个第一行)。
另外,q.ID是否唯一?如果是这样,则您无需按字段名称排序,可以使用SingleOrDefault代替FirstOrDefault。“单一”确保存在一个元素,而“第一”确保存在至少一个元素。应该使用“单个”陈述您的假设,这对于更多的自我记录代码而言是唯一的。
int thisvalue = context.tablename
.Where(q => q.ID == id)
.Select(q => q.fieldname)
.SingleOrDefault();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句