{"error": "Explicitly constructing the object type ### 'in the request is not allowed." }

I am new to LINQ and I am getting this error message:

{"error": "Explicit construction of the object type" Proj.Models.Ad "in the request is not allowed." }

I am using this code to retrieve data

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");
    }
}

      

Ad class

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; }
}

      

+3


source to share


1 answer


Ad

is also displayed and you cannot project a new instance of this type in the request. See this question .

What you can do is just create an anonymous type, or even better in this case, since you are only using an ID

object in your query Ad

, just:

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,
            /* ... */
        };

      



I recommend that you familiarize yourself with the navigation features. I think this query will look neater

Also maybe look at this option instead of using the method syntax for the first table, it might be more readable:

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,
            /* ... */
        };

      

+1


source







All Articles