2014-03-13 124 views
2

我不知道问题是否格式正确,但我想要做的是在using循环外创建var reservations,但不知道如何初始化它。匿名类型列表声明

此代码:

using (MainContextDB db = new MainContextDB()) 
{ 
    var reservations = (from c in db.Reservations select new { c.CustAcctNo, c.ReservNo, c.ReservStatus }).ToList(); 
} 

任何企图申报外循环var会触发一个错误:

Cannot convert List to List

我已经试过:

var reservations = new List<dynamic>(); 
var reservations = new List<object>(); 

此代码适用于bu Ť需要检索所有列,这不是我想要的:

List<Reservation> reservations = new List<Reservation>(); 
using (MainContextDB db = new MainContextDB()) 
{ 
    reservations = db.Reservations.ToList(); 
} 
+1

可能重复http://stackoverflow.com/questions/2327594/declaration-of-anonymous-types -list) –

+1

'using'语句的全部内容是在'catch'块中添加适当的清理。如果你实现了一个正确的'try'和'catch'模块,它能够使用'using'的功能,你不需要使用''''。这应该让你以不同的方式思考问题。我认识到'var reservations'的范围仍然必须与'try'的范围相关联(因为否则,'catch'如何能够正确处理对象的范围访问权限),但也许这会有所帮助你会发现不同的解决方案。 – ErikE

+0

@ErikE +1 Agree.This是我最终使用的解决方案。 –

回答

2

你可以这样来做:

var reservations = new [] 
{ 
    new { CustAcctNo = "", ReservNo = "", ReservStatus = "" } 
}.ToList(); 

using (MainContextDB db = new MainContextDB()) 
{ 
    reservations = (
     from c in db.Reservations 
     select new 
     { 
      c.CustAcctNo, c.ReservNo, c.ReservStatus 
     }).ToList(); 
} 

你一定要确保你匹配您的匿名类的成员的类型。


另一种选择是添加对Microsoft Reactive Framework团队的“交互式扩展”的引用。他们有enmerables一个很好的方法Using让你这样做:

var reservations = 
    EnumerableEx 
     .Using(
      () => new MainContextDB(), 
      db => 
       from c in db.Reservations 
       select new 
       { 
        c.CustAcctNo, c.ReservNo, c.ReservStatus 
       }) 
     .ToList(); 
+1

我已经看到过第一个例子,但在我看来,第二个例子是目前最好的解决方案。 –

1

确定这最终是一个非常有趣的question-

我知道匿名类型不应该离开的方法方面,真的没有想过他们离开范围,但...

我看到几个可能的选项...

  • 做一些hackey - 两个匿名类型具有相同的Signa ture共享相同的类型,所以你可以强迫它接受原型并从那里开始。 (转换成一个列表是困难的,但在仿制药可行的......看到张贴SIMO链接)

  • 移动运营到您的使用情况下,我知道是不理想

  • 手动配置上下文

  • 处理动态项目

  • 您可以代替匿名类型

自定义类型或元组10

希望有所帮助,我有些惊讶,如果你留在方法范围内,没有一种简单的方法可以做到这一点。

+0

+ 1为您的建议和意见。谢谢 –

0

注:我会用没有的以下方法在性能敏感的代码

话虽如此,我看到一个非常简单的解决方案,这也可以应用于处理List<T>以外的其他类型。类型推断的位干得不错:

private T InvokeAndReturn<T>(Func<T> func) 
{ 
    return func(); 
} 

用法:

// reservations is List<'a>. 
var reservations = this.InvokeAndReturn(() => 
{ 
    using (var db = new MainContextDB()) 
    { 
     return db.Reservations 
      .Select(c => new { c.CustAcctNo, c.ReservNo, c.ReservStatus }) 
      .ToList(); 
    } 
}); 

新鲜编辑

只是曾在自己的代码使用这一点,并选择了一个IDisposable知晓替代替代:

TReturn Using<TDisposable, TReturn>(TDisposable disposable, Func<TDisposable, TReturn> func) 
    where TDisposable : IDisposable 
{ 
    try 
    { 
     return func(disposable); 
    } 
    finally 
    { 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
     } 
    } 
} 

美国GE:

var reservations = Using(new MainContextDB(), db => 
{ 
    return db.Reservations 
     .Select(c => new { c.CustAcctNo, c.ReservNo, c.ReservStatus }) 
     .ToList(); 
}); 

或者更短的版本

var reservations = Using(new MainContextDB(), db => 
    db.Reservations 
     .Select(c => new { c.CustAcctNo, c.ReservNo, c.ReservStatus }) 
     .ToList() 
); 
[匿名类型名单的声明(中