Подтвердить что ты не робот

Каков возвращаемый тип моего запроса 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();
    }
4b9b3361

Ответ 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();
    }