Как вернуть Generic.List <Anonymoustype>из функции в C # - PullRequest
0 голосов
/ 10 декабря 2010

ASP.NET 3.5 C #
Я соединяю две таблицы, используя Linq.
Имена таблиц - это MapAssets и ExitPoint.
В базе данных они связаны с "имеет связь"

IЯ пишу функцию в моем BLL, чтобы вернуть объединенную таблицу

        public List<ExitPoints> GetExitPointDetailsByProjectID(int iProjectID)
        {
            ctx = new CoreDBDataContext();
            var exitPointDetails = from ma in ctx.MapAssets
                                   join ep in ctx.ExitPoints
                                   on ma.MapAssetID equals ep.MapAssetID
                                   where ma.ProjectID == iProjectID
                                   select new
                                   {
                                       //would like to have data from both tables here
                                       ctx.MapAssets,
                                       ctx.ExitPoints
                                   };
            return exitPointDetails.ToList();
        }

Это, очевидно, не работает.И я вообще не знаю, что возвращать.
Все, что у меня есть для возврата, - это возможность быть привязанным к сетке.
Это правильный путь?Или каков правильный путь?

Ответы [ 7 ]

6 голосов
/ 10 декабря 2010

Вы не можете или, что еще лучше, единственный способ вернуть их в штучной упаковке в List из object, но это очень усложняет ситуацию, потому что вы не можете привести их к какому-либо типу (конечно, это анонимно)) и вы можете получить доступ к их свойствам только через отражение ....

В таких случаях я настоятельно рекомендую вам создать собственный класс.

РЕДАКТИРОВАТЬ:

На заметку ...
Если бы вы использовали .net 4, все было бы проще, потому что вы могли бы вернуть dynamic Тип вместо object (смотритепо этой ссылке , чтобы увидеть упрощения dynamic), но я бы все равно предпочел создать собственный класс.

2 голосов
/ 10 декабря 2010

Посмотрите, как вернуть анонимные типы из метода.

http://forums.asp.net/t/1387455.aspx.

Копирование кода по ссылке.

object ReturnAnonymous()  
{  
  return new { Name="Faisal", City="Chakwal" };  
}  

// Application entry-point  
void Main()  
{  

  object o = ReturnAnonymous();  

   // This call to 'Cast' method converts first parameter (object) to the  
   // same type as the type of second parameter - which is in this case   
   // anonymous type with 'Name' and 'City' properties  
   var typed = Cast(o, new { Name="", City="" });  
   Console.WriteLine("Name={0}, City={1}", typed.Name, typed.City);  
 }  

 // Cast method - thanks to type inference when calling methods it   
 // is possible to cast object to type without knowing the type name  
 T Cast<T>(object obj, T type)  
 {  
   return (T)obj;  
 }  

Вы можете использовать метод, указанный ниже, чтобы вернуть List и

List<object> lstAnonymousTypes = GetExitPointDetailsByProjectID(1);

foreach(object o in lstAnonymousTypes)
{
   //Change it accordingly
   var typed = Cast(o, new { new MapAssets() , new ExitPoints() }); 
}

Надеюсь, это поможет, не пытались.

1 голос
/ 10 декабря 2010

Вам нужно привязать этот объект после того, как вы его создали? Если нет, то вы можете создать «постоянный класс AnonymousType», который хранит значения в словаре и возвращает значения свойств с помощью метода, подобного следующему:

string lastName AnonType.GetValue<string>("LastName");
int age AnonType.GetValue<int>("Age");

Вот ссылка на отличный пример . У автора также есть пример , где он создает «AnonymousType» из таблицы данных.

Я работал над вариантом этого , где я предоставляю возможность запрашивать список «AnonymousType» со следующим синтаксисом:

// Вот запрос var dept13 = anonAgents.AsQueryable () .Where (x => x.Has ("Department", Compare.Equal, 13);

// Вот как создается список

private static AnonymousType ProvisionAgent(string name, int department)
        {
            return AnonymousType.Create(new
            {
                Name = name,
                Department = department
            });
        }

        private List<AnonymousType> CreateAnonAgentList()
        {
            var anonAgents = new List<AnonymousType>();

            //  Dave and Cal are in Department 13
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Dan Jacobs", 13, 44)));
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Calvin Jones", 13, 60)));

            //  Leasing = Dept 45
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stanley Schmidt", 45, 36)));
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Jeff Piper", 45, 32)));
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stewart Blum", 45, 41)));
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stuart Green", 45, 38)));

            //  HR = Dept 21
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Brian Perth", 21, 25)));
            anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Katherine McDonnel", 21, 23)));

            return anonAgents;
        }
1 голос
/ 10 декабря 2010

Вы пытаетесь вернуть List ExitPoints и List MapAssets, что невозможно, поскольку вы получаете выходные данные из обеих таблиц, т.е. И также невозможно вернуть анонимный тип. Поэтому для повторного запуска запроса создайте имя класса ExMapClass со свойствами, которые вам нужны в качестве выходных данных запросов. Теперь после выполнения запроса linq, который вы написали, повторите его, т.е.

создать список вновь созданного класса

list newclass = new list ();

foreach (результат var в ctx) {

создать созданный класс

obj.Property1 = var.MapAssets;

obj.Property2 = var.ExitPoints;

newclass.add (OBJ);

}

теперь перезапускаем список вновь созданного класса.

надеюсь, вы получили это.

1 голос
/ 10 декабря 2010

Вы не можете вернуть анонимный тип, вы можете использовать только анонимный тип в области действия метода, в котором он находится. Вам может понадобиться создать новый класс со свойствами MapAssets / ExitPoints и выбрать новый экземпляр этого класса.

0 голосов
/ 27 февраля 2013

Просто используйте и ArrayList

    public static ArrayList GetMembersItems(string ProjectGuid)
    {
        ArrayList items = new ArrayList(); 
        items.AddRange(yourVariable 
                        .Where(p => p.yourProperty == something)
                        .ToList());
        return items;
    }
0 голосов
/ 10 декабря 2010

не работаешь?

ctx = new CoreDBDataContext();
var exitPointDetails = from ma in ctx.MapAssets
                       join ep in ctx.ExitPoints
                           on ma.MapAssetID equals ep.MapAssetID
                       where ma.ProjectID == iProjectID
                       select Tuple.Create(ma, ep);
return exitPointDetails.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...