指定类型部件没有在LINQ支撑到实体。 只有初始化,实体成员和实体导航属性都支持(The spe

2019-06-17 11:51发布

var result =
    (from bd in context.tblBasicDetails
     from pd in context.tblPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
     from opd in context.tblOtherPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
     select new clsProfileDate()
     {
         DOB = pd.DOB
     });

foreach (clsProfileDate prod in result)
{
    prod.dtDOB = !string.IsNullOrEmpty(prod.DOB) ? Convert.ToDateTime(prod.DOB) : DateTime.Today;
    int now = int.Parse(DateTime.Today.ToString("yyyyMMdd"));
    int dob = int.Parse(prod.dtDOB.ToString("yyyyMMdd"));
    string dif = (now - dob).ToString();
    string age = "0";
    if (dif.Length > 4)
    age = dif.Substring(0, dif.Length - 4);
    prod.Age = Convert.ToInt32(age);
}

GetFinalResult(result);

protected void GetFinalResult(IQueryable<clsProfileDate> result)
{
    int from;
    bool bfrom = Int32.TryParse(ddlAgeFrom.SelectedValue, out from);
    int to;
    bool bto = Int32.TryParse(ddlAgeTo.SelectedValue, out to);

    result = result.AsQueryable().Where(p => p.Age >= from);
}

在这里,我得到一个例外:

指定的类型成员“年龄”不支持LINQ到实体。 只有初始化,实体成员和实体导航属性都支持。

凡年龄是不是在数据库是财产我clsProfileDate类创建从DOB计算年龄。 任何解决这个?

Answer 1:

不能使用未在映射到数据库列属性Where表达。 你必须根据映射属性,如构建表达式:

var date = DateTime.Now.AddYears(-from);
result = result.Where(p => date >= p.DOB);
// you don't need `AsQueryable()` here because result is an `IQueryable` anyway

至于你未映射的替代Age属性,你可以提取这种表达到像这样一个静态方法:

public class clsProfileDate
{
    // ...
    public DateTime DOB { get; set; } // property mapped to DB table column

    public static Expression<Func<clsProfileDate, bool>> IsOlderThan(int age)
    {
        var date = DateTime.Now.AddYears(-age);
        return p => date >= p.DOB;
    }
}

然后用它是这样的:

result = result.Where(clsProfileDate.IsOlderThan(from));


Answer 2:

很多人会说这是一个不好回答,因为它不是最好的做法,但你也可以在你的面前,其中转换到一个列表。

result = result.ToList().Where(p => date >= p.DOB);

Slauma的回答是好,但这将正常工作。 这种成本更多的是因为ToList()将会对数据库执行查询,并将结果移动到内存中。



Answer 3:

您也将获得此错误消息,当您不小心忘记定义setter的属性。 例如:

public class Building
{
    public string Description { get; }
}

var query = 
    from building in context.Buildings
    select new
    {
        Desc = building.Description
    };
int count = query.ToList();

到ToList呼叫将给予同样的错误信息。 这是一个非常微妙的错误,防不胜防。



Answer 4:

忘了选择列(或设置/映射属性到列值):

IQueryable<SampleTable> queryable = from t in dbcontext.SampleTable
                                    where ...
                                    select new DataModel { Name = t.Name };

调用queryable.OrderBy("Id")会抛出异常,即使DataModel已经财产Id定义。

正确的查询是:

IQueryable<SampleTable> queryable = from t in dbcontext.SampleTable
                                    where ...
                                    select new DataModel { Name = t.Name, Id = t.Id };


Answer 5:

在这种情况下,最简单,最好的方法之一是先投它list ,然后用whereselect

result = result.ToList().where(p => date >= p.DOB);


文章来源: The specified type member is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported