【问题标题】:Linq not seeing propertiesLinq 看不到属性
【发布时间】:2016-02-11 14:13:48
【问题描述】:

我有以下类,我正在尝试从不同的相关类访问它的属性,如下所示:

var nuInfo = recipe.RECIPE_INGREDIENT
    .Select(i => i.INGREDIENT.INGREDIENT_NUTRITIONAL_INFO)
    .Where(ni => ni.NUTRITIONAL_INFO.Main == 1);

但是,我无法访问INGREDIENT_NUTRITIONAL_INFO 的任何(虚拟或非虚拟)属性。

INGREDIENT_NUTRITIONAL_INFO 类如下:

 public class INGREDIENT_NUTRITIONAL_INFO
 {
     public int IngredientId { get; set; }
     public int Nutritional_InfoId { get; set; }
     public double Amount { get; set; }
     public DateTime DateSubmitted { get; set; }
     public DateTime DateModified { get; set; }
     public string SubmittedBy { get; set; }
     public string ModifiedBy { get; set; }

     public virtual AspNetUsers AspNetUsers { get; set; }
     public virtual AspNetUsers AspNetUsers1 { get; set; }
     public virtual INGREDIENT INGREDIENT { get; set; }
     public virtual NUTRITIONAL_INFO NUTRITIONAL_INFO { get; set; }
}

错误代码如下:

CS1061“ICollection”不包含“NUTRITIONAL_INFO”的定义,并且找不到接受“ICollection”类型的第一个参数的扩展方法“NUTRITIONAL_INFO”(您是否缺少 using 指令或程序集引用?)

我在 Linq 中遗漏了什么吗?我是否试图跨越太多的关系?

【问题讨论】:

  • 您可以访问 IngredientId 吗?或者你不能访问虚拟实体类型?
  • 关键是堆栈跟踪中的ICollection。事物的集合与单个事物不同。
  • 能否展示相关的类?
  • 延迟加载启用还是禁用?@rory
  • @AlperTungaArslan 延迟加载已启用

标签: sql asp.net-mvc entity-framework linq


【解决方案1】:

错误是因为您没有在查询末尾添加.First().FirstOrDefault()

var nuInfo = recipe.RECIPE_INGREDIENT.Select(i => i.INGREDIENT.INGREDIENT_NUTRITIONAL_INFO)
.Where(ni => ni.NUTRITIONAL_INFO.Main == 1)

您的代码试图将NUTRITIONAL_INFO 作为集合的属性而不是集合中成员的属性来访问。

【讨论】:

    【解决方案2】:

    问题在于 nuInfo 不仅仅是一个 INGREDIENT_NUTRITIONAL_INFO 对象,您的 LINQ 查询将结果返回为 IEnumerable<T>

    如果您想获得单个结果,您可以使用First()FirstOrDeafultSingle()SingleOrDefault 来代替返回单个结果。

    var nuInfo = recipe.RECIPE_INGREDIENT
    .Select(i => i.INGREDIENT.INGREDIENT_NUTRITIONAL_INFO)
    .FirstOrDefault(ni => ni.NUTRITIONAL_INFO.Main == 1);
    

    【讨论】:

    • 我需要返回INGREDIENT_NUTRITIONAL_INFO的列表
    • 您的代码看起来应该已经这样做了,recipe.RECIPE_INGREDIENTIEnumerable<INGREDIENT_NUTRITIONAL_INFO> 对吗?
    • 是的,recipe.RECIPE_INGREDIENTICollection<RECIPE_INGREDIENT>
    • 那么除非我弄错 nuInfo 应该是 IEnumerable<INGREDIENT_NUTRITIONAL_INFO> ,否则错误来自哪里的 linq 语句还是其他地方?
    • 拥有ICollection 而不是IEnumerable 导致我得到答案:var nuInfo = recipe.RECIPE_INGREDIENT.ToList().Select(i => i.INGREDIENT.INGREDIENT_NUTRITIONAL_INFO.ToList().Where(ni => ni.NUTRITIONAL_INFO.Main == 1));
    猜你喜欢
    • 1970-01-01
    • 2010-12-31
    • 2018-12-30
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多