如何在C#中返回通用列表集合?

时间:2009-12-20 22:24:30

标签: c# .net generics anonymous-types anonymous-methods

我有一些linq to sql方法,当它执行查询时,它会返回一些匿名类型。

我想将该匿名类型返回到我的服务层,以便在其上执行一些逻辑和操作。

我不知道如何归还。

我以为我能做到这一点

public List<T> thisIsAtest()
{
     return query;
}

但我收到此错误

Error   1   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

所以不确定我错过了哪个程序集,或者甚至是这种情况。

由于

修改

好的,我的第一个问题已经解决,但现在我遇到了一个新问题,我不确定如何修复,因为我对匿名类型不太了解。

我收到此错误

  

无法隐式转换类型   'System.Collections.Generic.List'   到'System.Collections.Generic.List

这是查询

   DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0)
       .GroupBy(u => new { u.Table.Prefix })
       .Select(group => new { prefix = group.Key, 
                              Marks = group.Sum(item => (item.Mark * item.Weight) / item.OutOFF) })
       .ToList();

修改2

public class ReturnValue
{
   string prefix { get; set; }
   decimal? Marks { get; set; } 
}

public List<ReturnValue> MyTest(Guid userId)
{
   try
   {
       var result = dbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0).GroupBy(u => new { u.Table.Prefix })
       .Select(group => new { prefix = group.Key, Marks = group.Sum(item => (item.Mark * item.Weight) / item.OutOFF) }).ToList();
       return result;
   }
   catch (SqlException)
   {
       throw;
   }

选择中有这个

Anonymous Types:

a is new{string Prefix}
b is new{ 'a prefix, decimal? marks}

5 个答案:

答案 0 :(得分:8)

public List<T> thisIsAtest<T>()
{
     return query;
}

答案 1 :(得分:8)

你不能 - 期间。您不能使用自己范围之外的匿名类型,例如你不能将它们作为方法的返回值返回。

如果需要返回它们,则需要定义一个新的具体类而不是匿名类型,并在匿名类型的位置使用它。

请参阅Rick Strahl关于匿名类型范围的blog post,并查看明确指出的MSDN docs here

  

匿名类型具有方法范围。至   传递匿名类型,或者   包含匿名的集合   类型,在方法边界之外,你   必须先将类型转换为对象。   然而,这打败了强者   键入匿名类型。如果你   必须存储您的查询结果或通过   他们在方法边界之外,   考虑使用普通的名字   结构或类而不是   匿名类型。

好的,确定 - 确实有很多可怕的黑客确实会返回匿名类型。但如果微软的MSDN AND Jon Skeet不鼓励这种做法,那么 - 就是不要这样做。根据定义和意图,匿名类型与它们定义的方法绑定。

chobo2的

UPDATE :我不知道你的数据类型是什么 - 只是猜测 - 但假设“prefix”是一个int而“marks”是一个小数,你可以定义一个新的类:

public class ReturnValue
{
    int prefix { get; set; }
    decimal Marks { get; set; } 
}  

然后您的代码将是一个返回List<ReturnValue>

的方法
public List<ReturnValue> thisIsAtest()
{
   DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0)
     .GroupBy(u => new { u.Table.Prefix })
     .Select(group => new ReturnValue 
                          { prefix = group.Key, 
                            Marks = group
                              .Sum(item => (item.Mark * item.Weight) / item.OutOFF) })
     .ToList();
}

这里的关键是:在.Select方法中,而不是创建匿名类型的新实例:

     .Select(group => new { prefix = group.Key, marks = .... }

您创建具体类型的实例:

     .Select(group => new ReturnValue { prefix = group.Key, marks = .... }

通过这种方式,您将拥有一个具体的类 ReturnValue - 您喜欢的任何名称 - 然后您可以轻松返回该类型的列表,并在其他地方使用该类型,太

答案 2 :(得分:2)

您想从常规方法返回匿名类型吗?我很确定你可以使用Reflection,但是没有类型安全和许多其他问题。更不用说从调用代码的角度来看它看起来很奇怪。您基本上必须返回我认为的对象。

你最好使用一个类或结构来填充值。

答案 3 :(得分:0)

匿名类型非常有限,只能在声明它们的方法范围内使用它们。

您可以将它们作为普通对象传回,但之后会丢失类型信息。我看到一些传递匿名类型的解决方案;但他们使用反射在稍后检索属性。

答案 4 :(得分:0)

如果将通用列表声明为全局变量,则无需使用return。无论如何,我在代码中使用了return函数仅仅是因为marc_s说我做不到。大声笑

 public static class Globals
    {
        public static List<string> CurPart = new List<string>();
    }
    public List<string> MSQueryRead1DArray(string sql, string db)
    {
        return Globals.CurPart;
    }