【问题标题】:return list with anonymous type in entity framework实体框架中具有匿名类型的返回列表
【发布时间】:2011-10-19 15:41:35
【问题描述】:

我如何返回匿名类型的列表,因为我得到了这段代码

“找不到类型或命名空间名称'T'(您是否缺少 using 指令或程序集引用?)”

我只需要返回 IdMember 和用户名,谢谢

    public static List<T> GetMembersItems(string ProjectGuid)
    {
        using (PMEntities context = new PMEntities("name=PMEntities"))
        {
            var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information")
                        .Where(p => p.Knowledge_Project.Guid == ProjectGuid)
                        .Select(row => new { IdMember = row.IdMember, UserName = row.Profile_Information.UserName });

            return items.ToList();
        }
    }

【问题讨论】:

  • 要使用这样的泛型返回类型,您需要使用额外的&lt;T&gt; 使其成为泛型方法,如下所示:public static List&lt;T&gt; GetMembersItems&lt;T&gt;(string ProjectGuid)。但是你还有其他问题......
  • Return anonymous type?的可能重复

标签: c# asp.net linq entity-framework


【解决方案1】:

Tuple 类是为这种情况而设计的。创建一个已经建议的自定义类更清晰,但 Tuple 也可以完成工作。

例如

.Select(row => new Tuple<int,string>(row.IdMember,row.Profile_Information.UserName))

要访问线路另一端的成员属性,您需要使用:

var id=t.Item1
var name=t.Item2

【讨论】:

  • 元组在实体框架中不起作用,因为您需要使用它们的初始化函数创建它们,而实体框架只允许您使用带有默认构造函数的类型
  • @Rabbi:您可以将匿名类型投影为可枚举,然后使用元组在内存中投影。查看更多:stackoverflow.com/questions/2118688/return-tuple-from-ef-select
  • ValueTuple 怎么样?
【解决方案2】:

因为您返回的是匿名类型的对象,所以您不能在方法的返回类型中声明它。您尝试使用通用的&lt;T&gt; 对此不起作用。没有类型安全的方式来声明这样的方法。如果您将返回类型声明为 IList,那么这应该可以工作,但您仍然没有类型安全性。

声明类型确实更好。

更新:

声明一个简单的返回类型并不是那么糟糕。你可以这样写一个类:

public class MemberItem
{
    public string IdMember { get; set; }
    public string UserName { get; set; }
}

然后像这样写你的方法:

public static List<MemberItem> GetMembersItems(string ProjectGuid)
{
    using (PMEntities context = new PMEntities("name=PMEntities"))
    {
        var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information")
                    .Where(p => p.Knowledge_Project.Guid == ProjectGuid)
                    .Select(row => new MemberItem { IdMember = row.IdMember, UserName = row.Profile_Information.UserName });

        return items.ToList();
    }
}

【讨论】:

  • 感谢回复,用这个选择返回列表的最佳方式是什么?
【解决方案3】:

匿名类型的范围仅限于定义它们的方法。在您的情况下,您最好声明一个具有相关属性的单独类并返回该类实例的集合。例如

public class UserDetail
{
   public int Id{get;set;}
   public string UserName {get;set;}
}

public static List<UserDetail> GetMembersItems(string ProjectGuid)
    {
        using (PMEntities context = new PMEntities("name=PMEntities"))
        {
            var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information")
                        .Where(p => p.Knowledge_Project.Guid == ProjectGuid)
                        .Select(row => new UserDetail{ IdMember = row.IdMember, UserName = row.Profile_Information.UserName });

            return items.ToList();
        }
    }

【讨论】:

    【解决方案4】:

    您可以通过将匿名类型强制转换为 Object 来返回匿名类型,但这很少有用。但是,如果您从 WebApi 控制器中返回它作为快速且(不是那么)脏的 DTO,那么我认为它非常好。 不过,这只适用于 JSON。 XML 会抱怨架构或其他东西,但现在每个人都使用 JSON :)

    public static List<Object> GetMembersItems(string ProjectGuid)
    {
        using (PMEntities context = new PMEntities("name=PMEntities"))
        {
            var items = context.Knowledge_Project_Members.Include("Knowledge_Project").Include("Profile_Information")
                        .Where(p => p.Knowledge_Project.Guid == ProjectGuid)
                        .Select(row => new { IdMember = row.IdMember, UserName = row.Profile_Information.UserName });
    
            return items
                   .ToList() // this is only needed to make EF happy otherwise it complains about the cast
                   .Cast<Object>()
                   .ToList();
        }
    }
    

    【讨论】:

      【解决方案5】:

      只需使用 and ArrayList

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

      【讨论】:

        【解决方案6】:

        您可以改为返回 type:NameValueCollection 或 KeyValuePair。 匿名类型不能是返回类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多