Каков возвращаемый тип моего запроса linq?
У меня есть две таблицы A и B. Я могу запускать запросы Linq и получать требуемые данные для отдельных таблиц.
Поскольку я знаю, что каждая из таблиц вернется, как показано в примере.
Но, когда я присоединяюсь к обеим таблицам, я не знаю о возвращаемом типе запроса 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
Созданное вами значение называется анонимным типом, и вы можете вернуть его, если вы не вернете 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
.
Ответ 2
Вы создали анонимный класс - вы действительно не можете его вернуть. Простым решением является добавление класса для представления вашего типа.
Например:
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();
}
Ответ 3
Как сказал Коби.
Если вы не хотите создавать класс специально для этого случая, вы можете использовать Tuple
. Поддерживается только поддержка .Net 4.
Ответ 4
Как вы создали анонимный (Анонимные типы генерируются компилятором, поэтому мы не можем знать имя типа в нашем коде), чтобы вы не могли его вернуть. Создайте отдельный класс с помощью три свойства 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();
}