如何在使用Linq时返回匿名类型

时间:2010-06-30 12:27:42

标签: c# asp.net linq anonymous-types

  

可能重复:
  LINQ to SQL: Return anonymous type?

任何人都知道如何返回匿名类型。我正在使用Linq,我需要返回以下代码

private <What's the return type to be provided here> SampleLinq(Int32 Num)
    {
        var query = (from dept in obj.DeptTable where dept.Id == Num select new { dept.DeptName, dept.DeptId });
        return (query)       

    }

8 个答案:

答案 0 :(得分:4)

很抱歉,但是你不能以匿名方式返回方法的范围。

这是获取无类型的替代方式

// Method that returns anonymous type as object
object ReturnAnonymous()
{
  return new { City="Prague", Name="Tomas" };
}

// Application entry-point
void Main()
{
  // Get instance of anonymous type with 'City' and 'Name' properties
  object o = ReturnAnonymous();

  // This call to 'Cast' method converts first parameter (object) to the
  // same type as the type of second parameter - which is in this case 
  // anonymous type with 'City' and 'Name' properties
  var typed = Cast(o, new { City="", Name="" });
  Console.WriteLine("Name={0}, City={1}", typed.Name, typed.City);
}

// Cast method - thanks to type inference when calling methods it 
// is possible to cast object to type without knowing the type name
T Cast<T>(object obj, T type)
{
  return (T)obj;
}

您只能将它用于一个程序集中的类型(来自两个不同程序集的两个匿名类型将在内部编译为两个不能使用此技巧转换的不同类型)。

答案 1 :(得分:3)

返回动态类型:

      public static dynamic  getCustomer() 
{ 
    ..... 
    var x = from c in customers 
            select new {Fname = c.FirstName}; 

    return x; 
} 

static void Main(string[] args) 
{ 
    dynamic x = getCustomer(); 
    Console.WriteLine(Enumerable.First(x).Fname); 
    Console.ReadKey(); 
} 

答案 2 :(得分:1)

你不能那样做。这就是为什么它被称为匿名。它没有名字。但是你总是可以把它投射到object

答案 3 :(得分:1)

嗯,你实际上不能这样做,但here's a hack就此而言。

答案 4 :(得分:0)

您无法从方法返回匿名类型。

您可以创建一个简单的类来包装匿名类型,但您仍然需要一个类(或转换为object)。

但请记住,如果你施放到object,则无法退回。你需要反思来阅读任何数据。

答案 5 :(得分:0)

private object SampleLinq(Int32 Num)
{
return (from dept in obj.DeptTable where dept.Id == Num select new { dept.DeptName, dept.DeptId });
}

答案 6 :(得分:0)

您从黑客中看到的答案是通过方法边界获取匿名类型的大量工作。你不应该这样做。如果你需要从方法中传回一些东西,你应该传递具体的类型。

答案 7 :(得分:-1)

这取决于您对退货价格的看法。

  • 如果要在UI中绑定它 你可以重新运行 IEnumerable IQueryable

  • 如果要在返回值上使用反射,只需返回类型对象

  • 如果您使用c#4.0,则可以返回 动态类型

  • 如果您使用 EF Linq to SQL 进一步加入由您的匿名类型组成的查询 可以改为具体而且 使用具体占位符 技术。有关详细信息 技术我可以提供一些帮助。

正如其他人所提到的那样,你应该真正质疑返回一个匿名类型形式的方法是解决手头问题的最佳方法。通常,通常存在更好的基于模式的方法,其可能需要在前面进行更多编码,但可能导致更优雅的设计。话虽如此,我确实认为存在合法的情况,例如数据绑定,其中返回的匿名类型实例是完全可以接受的。

<强>更新: 只是一个感兴趣的花絮,我想分享,以防那些阅读不知道。匿名类型对于它们的属性名称和类型是唯一的,所以假设你有两个方法A和方法B,你创建一个匿名类型,它具有一个名为Name的单字符串类型属性,通过执行类似下面的代码。

public object A()
{
    return new { Name = "Cid" }
}

public object B()
{
    return new { Name = "Galuf" }
}

public void Test()
{
   System.Diagnostics.Trace.Assert(A().GetType() == B().GetType());
}

现在,即使此类型在两个单独的位置定义,编译器也只创建一个共享类型,因为它们都具有由属性类型和属性名称定义的相同属性集。在这方面,属性可以被认为是匿名类型的签名。使用这些知识,有不同的技术可用于内省到使用dynamic关键字转换为object或deferred的匿名类型实例。正如Linq对静态Enumerable和Queryable类中的方法所做的那样,使用泛型方法也可以使用匿名类型。这样,您可以执行诸如创建任何给定匿名类型的新实例而不使用反射的操作。诀窍是,您必须使用匿名类型的实例传递给方法,以便通用方法推断出类型。如果有人对这些主题感兴趣,因为它们适用于原始海报问题,请发表评论,我可以尝试澄清其中的一些技巧。