【问题标题】:Get ICollection property of generic type获取泛型类型的 ICollection 属性
【发布时间】:2015-02-15 06:20:54
【问题描述】:

我是 ASP.NET MVC 5 的新手,我需要获取 Icollection 属性并搜索其他属性,如果打印第一次搜索的结果很好,但是当我去搜索时结果为空。

有什么问题?

var userId = User.Identity.GetUserId();
var user = db.Users.Include( u=> u.Sucursales)
                   .Where(u => u.Id == userId)
                   .SingleOrDefault();

if( user != null )
{
    var sucursal = user.Sucursales.Include(s => s.Emisor)
                                  .Where(s => s.ID == suc)
                                  .SingleOrDefault();
    if (sucursal != null)
    {
        var tipoCfe = sucursal.Emisor.TiposCfe
                                     .Where(t => t.ID == factura)
                                     .SingleOrDefault();

【问题讨论】:

  • 你能说得更具体点吗?哪个结果为空?
  • sucursal == null,但 sucursal.ID == suc 在 user.Sucursales 中。
  • suc 的值在哪里设置,设置什么?
  • 困难的一个。我看不出代码有什么问题。您是否 100% 确定 Sucursales 包含元素并且变量“suc”具有正确的值?
  • 有关包含方法的更多信息...msdn.microsoft.com/en-us/library/bb738708%28v=vs.110%29.aspx 您可能需要执行以下操作:db.Users.Include("Sucursales.Emisor")

标签: c# linq asp.net-mvc-5 icollection


【解决方案1】:

由于您使用的是SingleOrDefault(),因此您的查询将立即进行,请参阅this StackOverflow question pertaining to SingleOrDefault() 您的Include(s => s.Emisor) 对我来说很重要。由于在获取用户时未包含 Emisor,因此您将无法请求它,因为您的查询不再是 IQueryable 类型。您的查询已被执行。

为了检索您需要的数据,您必须在第一次查询期间获取数据。当您检索用户时,我会执行类似于:db.Users.Include("Sucursales.Emisor") 的操作。

更多关于包含方法...MSDN Explanation of Include Method

【讨论】:

    【解决方案2】:

    我变了

    var user = db.Users.Include( u=> u.Sucursales)
    

    var user = db.Users.Include("Sucursales.Emisor") 
    

    【讨论】:

    • 如果你想要一个类型安全的方法,请使用db.Users.Include(u=> u.Sucursales.Select(s => s.Emisor))
    猜你喜欢
    • 1970-01-01
    • 2012-12-17
    • 2020-01-29
    • 2015-07-28
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多