簡體   English   中英

實體框架中匿名類型的返回列表

[英]return list with anonymous type in entity framework

我如何使用匿名類型返回列表,因為使用此代碼我得到

“找不到類型或命名空間名稱‘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();
    }
}

只需使用和 ArrayList 代替

    public static ArrayList GetMembersItems(string ProjectGuid)
    {
        ArrayList items = new ArrayList(); 

              items.AddRange(yourVariable 
                        .Where(p => p.Knowledge_Project.Guid == ProjectGuid)
                        .ToList());
            return items;
    }

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM