1. ホーム
  2. entity-framework-4

指定されたタイプ・メンバーは、LINQ to Entities ではサポートされていません。イニシャライザ、エンティティ・メンバ、およびエンティティ・ナビゲーション・プロパティのみがサポートされています。

2023-07-25 15:58:58

質問

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

ここで、例外が発生しました。

指定された型メンバー "Age" は、LINQ to Entities ではサポートされていません。 初期化子、エンティティ・メンバ、およびエンティティ・ナビゲーション・プロパティのみがサポートされています。 のみがサポートされています。

Ageがデータベースにない場合、DOBから年齢を計算するためにclsProfileDateクラスで作成したプロパティになります。これに対する解決策はありますか?

どのように解決するのですか?

データベースのカラムにマッピングされていないプロパティは 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));