我有两张桌子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();
}
答案 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
关键字的优势。