返回实体框架中匿名类型的列表

本文关键字:类型 列表 实体 框架 返回 | 更新日期: 2023-09-27 18:04:39

如何使用匿名类型返回列表,因为使用此代码我得到

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

我只需要返回IdMember和UserName,谢谢

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

返回实体框架中匿名类型的列表

Tuple<>就是为这种情况创建的。像前面建议的那样创建自定义类更加清晰,但Tupple也完成了这项工作。

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

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

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

因为返回的是匿名类型的对象,所以不能在方法的返回类型中声明它。您尝试使用通用<T>将无法解决此问题。没有类型安全的方式来声明这样的方法。如果你声明你的返回类型为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();
    }
}

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

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

您可以通过将匿名类型强制转换为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();
    }
}

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

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