Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq变量和类型化对象_C#_Asp.net_Linq_Entity Framework - Fatal编程技术网

C# Linq变量和类型化对象

C# 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

我想要一个代码样本。 目前,我在c和asp.NET4EF4中使用linq

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