繁体   English   中英

如何将System.Data.Entity.Infrastructure.DbQuery类型转换为System.Collections.Generic.List类型?

[英]How cast System.Data.Entity.Infrastructure.DbQuery type to System.Collections.Generic.List type?

我有两个简单的清单:

public partial class Visitor
{
    public Visitor()
    {
        this.Visits = new HashSet<Visit>();
    }

    public int Id { get; set; }
    public int PermitId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public bool IsValid { get; set; }
    public System.DateTime RegistrationDate { get; set; }
    public byte[] Picture { get; set; }
    public virtual ICollection<Visit> Visits { get; set; }
}

public partial class Visit
{
    public int Id { get; set; }
    public int VisitType { get; set; }
    public System.DateTime VisitDate { get; set; }
    public Nullable<int> Visitor_Id { get; set; }

    public virtual Visitor Visitor { get; set; }
}

在WCF方法中,我编写了查询并试图返回结果:

public List<Visitor> AllVisitors()
        {
            using (var te = new TurnstileDbEntities())
            {
                te.Configuration.ProxyCreationEnabled = false;


                return (List<Visitor>) te.Visitors.SelectMany(visitors => te.Visits
                    .Where(o => o.Visitor_Id == visitors.Id)
                    .DefaultIfEmpty(), (visitors, visit) => new {visitors, visit});
            }
        }

好了,正如我所料,我收到了一个例外:

附加信息:无法转换对象类型“ System.Data.Entity.Infrastructure.DbQuery 1[<>f__AnonymousType0 2 [ 1[<>f__AnonymousType0 ]]”以键入“ System.Collections.Generic.List`1 [ TurnstileWcfService.Visitor]”。

好。 我改写这个。 宣布新班级。

public class JoinResult
{
    public Visitor Visitors { get; set; }
    public Visit Visits { get; set; }
}

并重写方法。

   public IQueryable AllVisitors()
    {
        using (var te = new TurnstileDbEntities())
        {
            te.Configuration.ProxyCreationEnabled = false;

            return te.Visitors.Join(te.Visits, 
                r => r.Id, a => a.Visitor_Id, (r, a) => new JoinResult
            {
                Visits = a,
                Visitors = r
            });
        }
    }

这是可行的,但我想使用Visitor类。 访客类包含ICollectionVisits,我想填充它。 在不声明新类的情况下如何在Linq语句中执行此操作?

我也可以在下面的代码中得到想要的东西。 但是我不喜欢这样。

var visitors = te.Visitors.ToList();
foreach (var item in visitors)
{
      item.Visits = te.Visits.Where(v => v.Visitor_Id == item.Id).ToList();
}

Gert Arnold是正确的,请尝试:

List<Visitor> visitors = te.Visitors.Include(v => v.Visits).ToList();

编辑我也可以如下工作:

List<Visitor> visitors = te.Visitors.Include("Visits").ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM