我的linq查询的返回类型是什么?

时间:2011-02-16 07:06:35

标签: .net linq

我有两张桌子A& B.我可以解雇Linq查询&获取各个表所需的数据。 我知道每个表将返回的内容如示例所示。 但是,当我加入这两个表时,我不知道Linq查询的返回类型。这个问题可以通过创建一个将在其中包含ID,Name和Address属性的类来解决。但是,每次根据返回类型编写连接查询之前,我都必须创建一个不方便的类 有没有其他方法可以实现这个

  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();
    }

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:3)

像Kobi说的那样。

如果您不想专门为此案例创建一个类,则可以使用Tuple。仅支持.Net 4。

答案 2 :(得分: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 :(得分: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关键字的优势。