5

我有一些 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}
4

5 回答 5

12
public List<T> thisIsAtest<T>()
{
     return query;
}
于 2009-12-20T22:26:36.027 回答
8

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

如果您需要返回它们,您需要定义一个新的具体类而不是匿名类型,并使用它来代替匿名类型。

请参阅 Rick Strahl 的关于匿名类型范围的博客文章,并在此处查看 MSDN 文档,其中明确指出:

匿名类型具有方法范围。要在方法边界之外传递匿名类型或包含匿名类型的集合,您必须首先将类型强制转换为对象。 然而,这破坏了匿名类型的强类型。如果您必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型。

好的,当然 - 确实有一些肮脏可怕的黑客可以返回匿名类型。但是,如果 Microsoft 的 MSDNJon Skeet 不鼓励这种做法,那么 -不要这样做。根据定义和意图,匿名类型绑定到定义它们的方法。

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

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

然后您的代码将是一个返回 a 的方法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- 任何您喜欢的名称 - 然后您可以轻松地返回该类型的列表,并在其他地方使用该类型。

于 2009-12-20T22:27:21.797 回答
3

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

您最好使用一个类或结构并将值填充在那里。

于 2009-12-20T22:29:05.890 回答
0

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

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

于 2009-12-20T22:29:33.353 回答
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;
    }
于 2020-06-03T20:01:07.780 回答