{“error”:“不允许在查询中显式构造实体类型'###'。”}

时间:2017-04-01 08:51:18

标签: c# entity-framework linq api

我是LINQ的新手,我收到此错误消息:

  

{“error”:“实体类型'Proj.Models.Ad'的显式构造   不允许查询。“}

我正在使用此代码检索数据

public ActionResult favads()
{
    bool isValid = false;
    string authToken = "";
    if (Request["dt"] != null)
        authToken = Request["dt"].ToString().Trim();
    else
        return Content("{\"error\":\"Please send device token parameter 'dt'.\"}", "application/json");

    string message = (new CommonFunction()).ValidateToken(authToken, out isValid);

    if (isValid)
    {
        long userID = 0;
        if (Request["userID"] != null)
            long.TryParse(Request["userID"].ToString().Trim(), out userID);
        else
            return Content("{\"error\":\"Please send user id parameter 'userID'.\"}", "application/json");

        if (userID < 1)
            return Content("{\"error\":\"Please select appropriate user to view details.\"}", "application/json");

        try
        {
                var q = from d in db.AdsFavourites.Where(Favtb => Favtb.CreatedBy.Equals(userID) && Favtb.StatusID.Equals(1)).Select(p => new Ad() { ID = p.AdID.Value, CategoryID = int.Parse(p.CategoryID.ToString()) })
                    from c in db.Ads.Where(Adstb => Adstb.ID == d.ID).DefaultIfEmpty()
                    select new
                    {
                        FavId = d.ID,
                        c.ID,
                        c.Category.ParentCategoryID,
                        c.Category.CategoryID,
                        c.Category.LogoFile,
                        c.Category.CatName,
                        c.AdTitle,
                        AdDescription = (c.AdDescription.Length > 50 ? c.AdDescription.Substring(0, 50) : c.AdDescription),
                        c.CityID,
                        c.Price,
                        c.CreationDate,
                        c.Photos,
                        c.VideoUrl,
                        c.IsMobileVisibile
                    };

            int pg = 0;
            if (Request["p"] != null)
                int.TryParse(Request["p"], out pg);

            string _sortby = "MRF";
            if (Request["sortby"] != null)
                _sortby = Request["sortby"];

            if (_sortby.Equals("OF"))
                q = q.OrderBy(ad => ad.CreationDate.Value);
            else if (_sortby.Equals("PD"))
                q = q.OrderByDescending(ad => ad.Price.Value);
            else if (_sortby.Equals("PA"))
                q = q.OrderBy(ad => ad.Price.Value);
            else
                q = q.OrderByDescending(ad => ad.CreationDate.Value);

            return Json(q.ToList().Skip(pg * recordsPerPage).Take(recordsPerPage), JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            return Content("{\"error\":\"" + ex.Message + "\"}", "application/json");
        }
    }
    else
    {
        return Content("{\"error\":\"" + message + "\"}", "application/json");
    }
}

广告类

public class Ads : Ad
{
    public long ID { get; set; }
    public string FashionType { get; set; }
    public string ForRentSale { get; set; }
    public string ForJobHire { get; set; }
    public string JobTypeID { get; set; }
}

1 个答案:

答案 0 :(得分:1)

Ad也已映射,您无法在查询中像这样投影新的实例。请参阅this question

在这种情况下,您可以做的只是创建一个匿名类型甚至更好,因为在您的查询中,您只使用ID对象的Ad检索:

var q = from d in db.AdsFavourites.Where(Favtb => Favtb.CreatedBy.Equals(userID) && 
                                                  Favtb.StatusID.Equals(1))
                                  .Select(p => p.AdID.Value)
        from c in db.Ads.Where(Adstb => Adstb.ID == d).DefaultIfEmpty()
        select new
        {
            FavId = d,
            c.ID,
            c.Category.ParentCategoryID,
            /* ... */
        };

我建议您查看导航属性。我认为它会使这个查询看起来更整洁

也许可以看看这个选项,而不是使用第一个表的方法语法,可能更具可读性:

var q = from d in db.AdsFavourites
        //In this case also no need for `Equals` - you are comparing value types
        where d.CreateBy == userID && d.StatusID == 1

        from c in db.Ads.Where(Adstb => Adstb.ID == d.AdID.Value).DefaultIfEmpty()
        select new
        {
            FavId = d.AdID.Value,
            c.ID,
            /* ... */
        };