C# Linq变量和类型化对象
我想要一个代码样本。 目前,我在c和asp.NET4EF4中使用linqC# Linq变量和类型化对象,c#,asp.net,linq,entity-framework,C#,Asp.net,Linq,Entity Framework,我想要一个代码样本。 目前,我在c和asp.NET4EF4中使用linq var querySlotOrder = from slot in context.CmsSlots where slot.SlotId == myCurrentSlotId select slot; if (querySlotOrder.SlotOrder == myN
var querySlotOrder = from slot in context.CmsSlots
where slot.SlotId == myCurrentSlotId
select slot;
if (querySlotOrder.SlotOrder == myNewSlotOrder)
e.Cancel = true;
此linq查询仅返回一条记录
使用VAR,我无法获取类型化对象,也无法访问其属性SlotOrder
如何更改查询?谢谢你的帮助
关于该主题的有用资源:
LINQ select语句始终返回可查询的集合。因此,您需要从中获取单个对象
var querySlotOrder = (from slot in context.CmsSlots
where slot.SlotId == myCurrentSlotId
select slot).FirstOrDefault();
假设CmdSlot是元素的类型,返回对象的类型是IQueryable,querySlotOrder得到的类型是var的结果;var本身不是一种类型。如果您完全确定结果集合中始终只有一个元素,那么可以使用querySlotOrder.Single检索它。为什么要使用var?如果知道预期对象的类型,则应键入querySlotOrder:
正如Dennis在他的回答中指出的那样,您不会得到一个对象的实例,而是从查询中得到一个IEnumerable。为了访问SlotOrder属性,您需要从集合中选择一个特定的项,最有可能是第一个项—从您的查询判断。linq查询返回的不是一条记录,而是一个只有1个元素的记录集合。如果要获取第一个元素,并且确定集合中只有一个元素,请使用单扩展方法:
var querySlotOrders = from slot in context.CmsSlots
where slot.SlotId == myCurrentSlotId
select slot;
var querySlotOrder = querySlotOrders.Single();
if (querySlotOrder.SlotOrder == myNewSlotOrder)
e.Cancel = true;
即使查询返回单个对象,您在后台使用的Select方法也不会返回。它返回EF中的IQueryable 如果要存储单个对象,应使用Single、SingleOrDefault、First、FirstOrDefault等方法
var querySlotOrder = (from slot in context.CmsSlots
where slot.SlotId == myCurrentSlotId
select slot).Single();
这四种方法的区别在于:
Single:返回序列中唯一的元素,如果序列中没有一个元素,则引发异常。
SingleOrDefault:返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,此方法将引发异常。
第一:返回序列的第一个元素。
FirstOrDefault:返回序列的第一个元素,如果序列不包含元素,则返回默认值。
来自的定义这是madd0的代码,但已重新格式化为使用C样式而不是SQL样式
var querySlotOrder = context.CmsSlots
.Where(slot => slot.SlotId == myCurrentSlotId)
.Single();
最好阅读并理解whan SQL风格你不是在回答他的问题,而是在质疑他的风格。很多人使用var,包括许多Linq样本。没什么问题。无论如何,你的代码是不正确的。这将无法编译。假设每个插槽项的类型为MyObjectType,则结果查询的类型将为iQuery,而不是MyObjectType。不客气。这里最重要的是要记住,正如Aasmund在他的回答中所说的,var不是一个类型,而是在编译时被从右边表达式推断出的类型所取代-当使用EF中的Select方法时,这将是一个IQueryable IEnumerable,带有Linq to对象;当使用Single或其他方法时,您会得到T。再次感谢您的评论。这有助于我理解这个概念。byeAs对于var来说是正常的-如果你不使用它,你就不会有问题。
var querySlotOrder = context.CmsSlots
.Where(slot => slot.SlotId == myCurrentSlotId)
.Single();