如何从C#</anonymoustype>中的函数返回Generic.List <anonymoustype>

时间:2010-12-10 11:55:07

标签: c# asp.net linq linq-to-sql

ASP.NET 3.5 C#
我正在使用Linq加入两张桌子 表名是MapAssets和ExitPoint 在数据库中,它们与“有关系”

相关

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

这显然不起作用。我根本不知道要归还什么 我对返回的所有约束都是能够绑定到gridview 这是正确的方法吗?或者是正确的方式?

7 个答案:

答案 0 :(得分:6)

你不能或者更好,唯一的方法是将它们装回List object中,但这会使事情变得非常复杂,因为你无法将它们转换为任何类型(当然这是匿名的)你只能通过反思来访问他们的财产....

在这种情况下,我强烈建议您创建一个自定义类。

修改

旁注......
如果您使用的是.net 4,事情会更容易,因为您可以返回dynamic Type而不是object(请查看此link以查看dynamic的简化),但无论如何,我更愿意创建一个自定义类。

答案 1 :(得分:2)

看看如何从Method返回匿名类型。

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

希望这有助于不尝试。

答案 2 :(得分:1)

您不能返回匿名类型,您只能在其所在方法的范围内使用匿名类型。您可能需要使用MapAssets / ExitPoints属性创建一个新类,并选择该类的新实例。

答案 3 :(得分:1)

您正在尝试返回List ExitPoints和MapAssets列表,这是不可能的,因为您从两个表获取输出,即ExitPoints和MapAssets。而且也无法返回匿名类型。因此,为了重新启动查询,请创建一个类名ExMapClass,其中包含您作为查询输出所需的属性。现在执行你编写的linq查询后迭代它,即

创建新创建的类列表

列出newclass = new list();

foreach(在ctx中的var结果) {

实例化创建的类<​​/ p>

obj.Property1 = var.MapAssets;

obj.Property2 = var.ExitPoints;

newclass.add(OBJ);

}

现在重新开始新创建的类列表。

希望你明白了。

答案 4 :(得分:1)

创建它之后是否必须绑定到此对象?如果没有,那么您可以创建一个“持久性AnonymousType”类,该类将值存储在字典中,并使用以下方法返回属性值:

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

以下是指向excellent example的链接。作者还有一个example where he creates the "AnonymousType" from a datatable.

我使用以下语法处理了此where I provide the ability to query“AnonymousType”列表的变体:

//这是查询 var dept13 = anonAgents.AsQueryable()                 .Where(x =&gt; x.Has(“Department”,Compare.Equal,13);

//以下是List的构建方式

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

答案 5 :(得分:0)

只需使用和ArrayList

    public static ArrayList GetMembersItems(string ProjectGuid)
    {
        ArrayList items = new ArrayList(); 
        items.AddRange(yourVariable 
                        .Where(p => p.yourProperty == something)
                        .ToList());
        return items;
    }

答案 6 :(得分:-2)

不会这样做吗?

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