2011-02-16 45 views
12

我有两个表A & B.我可以激发Linq查询&获取单个表所需的数据。 因为我知道每个表将返回如示例中所示。 但是,当我加入这两个表我不知道Linq查询的返回类型。这个问题可以通过创建一个可以保存ID,Name和Address属性的类来解决。但是,每次写一个取决于返回类型加入查询之前,我将不得不创建一个类,这是不是一个方便易办法 是否有可用的任何其他马托来实现这一我的linq查询的返回类型是什么?

private IList<A> GetA() 
    { 
     var query = from a in objA 
        select a; 
     return query.ToList(); 
    } 

    private IList<B> GetB() 
    { 
     var query = from b in objB 
        select b; 
     return query.ToList(); 
    } 

    private IList<**returnType**?> GetJoinAAndB() 
    { 
     var query = from a in objA 
        join b in objB 
        on a.ID equals b.AID 
        select new { a.ID, a.Name, b.Address }; 
     return query.ToList(); 
    } 
+1

http://stackoverflow.com/questions/534690/linq-to-sql-return-anonymous-type – Jordan 2011-02-16 07:10:40

回答

1

您生成的值称为匿名类型,除非你回到object喜欢可以退货吗:

private object GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new { a.ID, a.Name, b.Address }; 
    return query.ToList(); 
} 

有两个很好的解决方案:
1是生成一个类来匹配输出和产生像了Kobi溶液
2.如果使用的是.NET 4可以返回一个dynamic型等

private dynamic GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new { a.ID, a.Name, b.Address }; 
    return query.ToList(); 
} 

然后就可以稍后使用它。您可以搜索互联网,了解使用dynamic关键字的优势。

+3

`动态`是为了与COM对象一起使用,而不是作为正确设计的替代。它会使开发变得非常困难 - 你失去了智能感知,并且所有编译错误都会变成**运行时错误**。 `object`只是更好一点,因为你仅限于无效的转换运行时错误。至少,测试了很多。 – Kobi 2011-02-16 07:52:22

14

您已经创建了一个匿名类 - 你不能真的回报它。一个简单的解决方案是添加一个类来表示你的类型。

例如:

public class UserWithAddress 
{ 
    public UserWithAddress(int id, string name, string address) 
    { 
     ID = id; 
     Name = name; 
     Address = address; 
    } 

    // you may have your own types here 
    public int ID { get; set; } 
    public String Name { get; set; } 
    public String Address { get; set; } 
} 

然后:

private IList<UserWithAddress> GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new UserWithAddress(a.ID, a.Name, b.Address); 
    return query.ToList(); 
} 
2

正如你已经创建了一个匿名(匿名类型由编译器产生的,所以我们无法知道我们的代码类型名称)类,以便您不能返回它。创建一个具有三个属性Id,Name和Address的单独类,然后将其返回。

public class Contact 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public string Address { get; set; } 

     } 

private IList<Contact> GetJoinAAndB() 
    { 
     var query = from a in objA 
        join b in objB 
        on a.ID equals b.AID 
        select new Contact{ a.ID, a.Name, b.Address }; 
     return query.ToList(); 
    } 
3

就像Kobi说的。

如果您不想专门为这种情况创建类,则可以使用Tuple。但只支持.Net 4。