0

中間層クラスにある LINQ クエリからデータを返す適切な方法を解読するのに助けが必要です...

最初のクエリは問題なく使用できますが、親エンティティまたは Project エンティティから特定の列を選択できません。

public List<Project> GetProjects()
        {
            try
            {
                using (YeagerTechEntities DbContext = new YeagerTechEntities())
                {
                    DbContext.Configuration.ProxyCreationEnabled = false;
                    DbContext.Database.Connection.Open();

                    IEnumerable<Project> project = DbContext.Projects.Where(p => p.ProjectID > 0);

                    List<Project> myProjects = new List<Project>();

                    myProjects = project.ToList();

                    return myProjects;

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

「DbContext.Projects.Where(p => p.ProjectID > 0).Select」で「AnonymousType#1 を IEnumerable に変換しています」という設計時のコンパイル エラーが発生するため、2 番目のクエリを使用できません。

public List<Project> GetProjects()
        {
            try
            {
                using (YeagerTechEntities DbContext = new YeagerTechEntities())
                {
                    DbContext.Configuration.ProxyCreationEnabled = false;
                    DbContext.Database.Connection.Open();

                    IEnumerable<Project> project = DbContext.Projects.Where(p => p.ProjectID > 0).Select(s => new
                    {
                        s.CategoryID,
                        s.Quote,
                        s.Name,
                        priname = s.Priority.Description,
                        catname = s.Category.Description,
                        statname = s.Status.Description,
                        s.Customer.Email,
                        s.Customer.City
                    });


                    List<Project> myProjects = new List<Project>();

                    myProjects = project.ToList();

                    return myProjects;

                }
            }

「proj.ToList()」で上記と同じ設計時のコンパイル エラーが発生するため、3 番目のクエリを使用できません。

public List<Project> GetProjects()
        {
            try
            {
                using (YeagerTechEntities DbContext = new YeagerTechEntities())
                {
                    DbContext.Configuration.ProxyCreationEnabled = false;
                    DbContext.Database.Connection.Open();

                    IEnumerable<Project> project = DbContext.Projects.Where(p => p.ProjectID > 0);

                    var proj = project.Select(s => new
                    {
                        s.CategoryID,
                        s.Quote,
                        s.Name,
                        priname = s.Priority.Description,
                        catname = s.Category.Description,
                        statname = s.Status.Description,
                        s.Customer.Email,
                        s.Customer.City
                    }
                );



                    List<Project> myProjects = new List<Project>();

                    myProjects = proj.ToList();

                    return myProjects;

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

中間層オブジェクトから LINQ クエリの内容を適切に渡す方法を教えてください。クライアントに戻ると、コードビハインドまたはコントローラーで「var」構文のクエリを使用するだけで明らかにそれを行う方法を知っています。


リビジョン #1

以下の jalpesh の回答に基づいて、(同じプロジェクト内に) ProjectFieldsというクラスを追加し、そのクラスを LINQ クエリに組み込みました。ただし、設計時のコンパイル エラー「無効な匿名型メンバー宣言です。匿名型メンバーは、メンバー割り当て、単純名、またはメンバー アクセスで宣言する必要があります。」

設計時のコンパイル エラーは、projfldsプロパティのすべての行にあります。

私はあなたたちが私に何をしたいのか知っています。基本的に、新しいクラスを作成し、そのクラスを層の間に送信します。ここで何が間違っているのですか????

以下は、私が作成した新しいクラスです。

public class ProjectFields
{
    public short CategoryID { get; set; }
    public decimal Quote { get; set; }
    public string Name { get; set; }
    public string PriorityName { get; set; }
    public string CategoryName { get; set; }
    public string StatusName { get; set; }
    public string Email { get; set; }
    public string City { get; set; }
}

以下は、エラーが発生する変更された LINQ クエリです。

public List<Project> GetProjects()
{
    try
    {
        using (YeagerTechEntities DbContext = new YeagerTechEntities())
        {
            DbContext.Configuration.ProxyCreationEnabled = false;
            DbContext.Database.Connection.Open();

            IEnumerable<Project> project = DbContext.Projects.Where(p => p.ProjectID > 0);
            ProjectFields projflds = new ProjectFields();

            var proj = project.Select(s => new
            {
                projflds.CategoryID = s.CategoryID,
                projflds.Quote = s.Quote,
                projflds.Name = s.Name,
                projflds.PriorityName = priname = s.Priority.Description,
                projflds.CategoryName = catname = s.Category.Description,
                projflds.StatusName = statname = s.Status.Description,
                projflds.Email = s.Customer.Email,
                projflds.City = s.Customer.City
            });

            List<Project> myProjects = new List<Project>();

            myProjects = project.ToList();

            return myProjects;
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
4

2 に答える 2

2

最終的な修正をいくつか行うだけで、ほぼ完了です。

public List<ProjectFields> GetProjects()
{
    try
    {
        using (YeagerTechEntities DbContext = new YeagerTechEntities())
        {
            DbContext.Configuration.ProxyCreationEnabled = false;
            DbContext.Database.Connection.Open();

            IQueryable<Project> project = DbContext.Projects.Where(p => p.ProjectID > 0);
            var proj = project.Select(s => new ProjectFields
            {
                CategoryID = s.CategoryID,
                Quote = s.Quote,
                Name = s.Name,
                PriorityName = s.Priority.Description,
                CategoryName = s.Category.Description,
                StatusName = s.Status.Description,
                Email = s.Customer.Email,
                City = s.Customer.City
            });

            List<ProjectFields> myProjects = project.ToList();

            return myProjects;
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
于 2013-07-15T19:35:11.203 に答える