【问题标题】:Only entity types, enumeration types or primitive types are supported in this context此上下文仅支持实体类型、枚举类型或原始类型
【发布时间】:2014-04-30 11:34:26
【问题描述】:

我目前正在处理搜索页面。我只需要返回包含存储在 int[] ST 中的所有主题标签 ID 的主题的主题详细信息列表。目前这行 (ST == null ? true : ST.Contains(b.ThemeTagID)) 似乎给了我一个错误

附加信息:无法创建类型为“System.Int32[]”的空常量值。此上下文仅支持实体类型、枚举类型或原始类型。

    public ActionResult Index(int ProviderID = 0, string Description = null, int[] ST = null)
    {

        var themedetail = from t in db.ThemeDetail
                          from b in t.ThemeTags
                          where (
                          (string.IsNullOrEmpty(Description) ? true : t.Description.ToLower().Contains(Description.ToLower())) &&
                          (ProviderID == 0 ? true : t.ProviderID == ProviderID) &&
                          (ST == null ? true : ST.Contains(b.ThemeTagID))
                              )
                          select t;

        ViewBag.ProviderID = new SelectList(db.ProviderDetails, "ProviderID", "ProviderName");
        ViewBag.MultiselectFeatures = new MultiSelectList(db.ThemeFeatures, "ThemeFeatureID", "ThemeFeaturesName");
        ViewBag.MultiselectTags = new MultiSelectList(db.ThemeTags, "ThemeTagID", "TagName");

        return View(themedetail.ToList());
    }

模型是...

[Table("ThemeDetail")]
public class ThemeDetail : Entity
{
    [Required]
    [Display(Name = "Name")]
    public string ThemeName { get; set; }
    public ThemeDetail()
    {
        ThemeFeatures = new List<ThemeFeature>();
        ThemeTags = new List<ThemeTag>();
        ThemeImages = new List<ThemeImage>();
    }

    public virtual ICollection<ThemeFeature> ThemeFeatures { get; set; }
    public virtual ICollection<ThemeTag> ThemeTags { get; set; }
    public virtual ICollection<ThemeImage> ThemeImages { get; set; }
}

[Table("ThemeTags")]
public class ThemeTag
{
    [Key]
    [Display(Name = "Theme Tag ID")]
    public int ThemeTagID { get; set; }

    [Display(Name = "Tag Name")]
    [Required]
    public string TagName { get; set; }

    public virtual ICollection<ThemeDetail> ThemeDetail { get; set; }
}

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    您在查询中使用ST,但它不能被转换为 SQL,因为 ST 是 int[] 并且可以是 null) 并且在 SQL 中没有任何 array。

    如果您更改查询以避免 null 检查 EF 将能够使用 WHERE ThemeTagID IN (...) 使用列表中提供的值翻译该查询(如果列表可能来自具有数千个元素的另一个查询,请小心):

    public ActionResult Index(int ProviderID = 0...
    {
        if (ST == null)
            ST = new int[0];
    

    然后简单地改变这个:

    (ST == null ? true : ST.Contains(b.ThemeTagID))
    

    到这里:

    ST.Contains(b.ThemeTagID)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多