2011-03-03 117 views
3

我想要一个代码示例。 目前我使用LINQ在C#和asp.net 4 EF4Linq VAR和输入对象

 var querySlotOrder = from slot in context.CmsSlots 
          where slot.SlotId == myCurrentSlotId 
          select slot; 

      if (querySlotOrder.SlotOrder == myNewSlotOrder) 
       e.Cancel = true; 

这LINQ查询只返回一个记录。

使用VAR我无法获得类型化对象,我无法访问其属性SlotOrder。

如何更改查询?感谢您的帮助

的话题用地资源:

http://msdn.microsoft.com/en-us/library/bb384065.aspx

http://msdn.microsoft.com/en-us/library/bb397947.aspx

http://msdn.microsoft.com/en-us/library/bb397678.aspx

+0

正如正常与var - 如果你没有使用它,你不会有问题。 – 2011-03-03 15:10:33

回答

7

即使你的查询返回一个对象,该Select方法,你在幕后使用,没有。它在EF中返回一个IQueryable<T>

如果要存储单个对象,则应使用诸如Single,SingleOrDefault,FirstFirstOrDefault的方法。

var querySlotOrder = (from slot in context.CmsSlots 
         where slot.SlotId == myCurrentSlotId 
         select slot).Single(); 

四种方法之间的区别在于:

  • Single:返回序列的唯一元素,如果存在的序列中的恰好一个要素是不抛出异常。
  • SingleOrDefault:返回序列的唯一元素,或者如果序列为空,则返回默认值;如果序列中有多个元素,则此方法会引发异常。
  • First:返回序列的第一个元素。
  • FirstOrDefault:返回序列的第一个元素,或者如果序列不包含元素,则返回默认值。

(从MSDN定义)

+0

非常感谢! – GibboK 2011-03-03 14:20:56

+0

不客气。这里最重要的是要记住,正如Aasmund在他的回答中所说的那样:'var'不是一种类型,而是在编译时由右边的表达式推导出来的类型替换 - 当使用“Select”方法从EF这将是'IQueryable '('IEnumerable '与Linq对象);当使用Single或其他方法时,你会得到'T'。 – madd0 2011-03-03 14:29:22

+0

再次感谢您的评论。它帮助我掌握这个概念,再见 – GibboK 2011-03-04 06:29:02

5

的LINQ select语句来始终返回一个可查询的集合。因此您需要从中获取单个对象。

var querySlotOrder = (from slot in context.CmsSlots 
         where slot.SlotId == myCurrentSlotId 
         select slot).FirstOrDefault(); 
5

类型返回的对象的是IQueryable<CmdSlot>(假设CmdSlot是元素的类型),以及querySlotOrder获取类型(这是的var的效果; var本身不是一个类型)。如果您确信结果集合中始终只有一个元素,您可以使用querySlotOrder.Single()来检索它。

-3

为什么使用var?如果你知道你所期望的对象的类型,你须querySlotOrder

MyObjectType querySlotOrder = (from slot in context.CmsSlots 
          where slot.SlotId == myCurrentSlotId 
          select slot).FirstOrDefault(); 

      if (querySlotOrder.SlotOrder == myNewSlotOrder) 
       e.Cancel = true; 
+3

你没有回答他的问题,而是质疑他的风格。许多人使用var,包括许多Linq样本。它没有错。无论如何,你的代码是不正确的。 – 2011-03-03 14:14:14

+0

这不会编译。假设每个槽项都是MyObjectType类型,结果查询将是IQueriable类型的,而不是MyObjectType类型。 – 2011-03-03 14:19:21

+0

我完全同意Rafa – GibboK 2011-03-03 14:28:32

2

丹尼斯在他的回答指出,你没有得到一个对象的实例,您取得一个IEnumerable回您的查询。为了访问SlotOrder属性,您需要从集合中选择一个特定的项目,很可能是第一个 - 通过查询来判断。

3

linq查询不会返回记录,而会返回集合中只有1个元素的记录。如果你想获得的第一个元素,并且有,如果你确信只有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; 
0

这是madd0的代码,但重新格式化使用C#风格替代了SQL风格

var querySlotOrder = context.CmsSlots 
    .Where(slot => slot.SlotId == myCurrentSlotId) 
    .Single(); 

这是更好地阅读和理解焕SQL风格