特定のエンティティをクエリするための式ビルダーまたはクエリ ビルダーを作成しています。エンティティは RequestBase と呼ばれ、このエンティティにはいくつかのプロパティがありますが、Request Base から継承するエンティティが他に 3 つあります。
TPH を使用しているため、識別子列を含むテーブルが 1 つだけ作成され、他のすべてのプロパティは RequestBase テーブルに作成されます。
問題は、Dynamic LINQ を使用して、RequestBase エンティティではなく子にあるプロパティをクエリする場合です。
**リクエスト ベースのコード**
public class RequestBase
{
public int RequestBaseId { get; set; }
public string CurrentStatus { get; set; }
public string RequestNumber { get; set; }
public DateTime RequestDate { get; set; }
public bool IsOnHold { get; set; }
public virtual Dealer Dealer { get; set; }
public virtual Requester Requester { get; set; }
public virtual Vehicle Vehicle { get; set; }
public virtual ICollection<Attachment> Attachments { get; set; }
public virtual ICollection<WorkflowHistory> WorkflowHistories { get; set; }
}
** EcoBonusRequest のコード**
public class EcoBonusRequest : RequestBase
{
public string BrandReturnedVehicle { get; set; }
public string TypeReturnedVehicle { get; set; }
public string ChassisReturnedVehicle { get; set; }
public string DestructionCertificateNumberReturnedVehicle { get; set; }
public decimal AmmountWithVAT { get; set; }
public decimal AmmountWithoutVAT { get; set; }
public decimal Percentage { get; set; }
public DateTime VehicleDesctructionDate { get; set; }
public virtual Customer Customer { get; set; }
public string Comments { get; set; }
}
** querybuilder のコード**
private string BuildQuery()
{
var sb = new StringBuilder();
//var list = RequestBaseBL.GetRequestByCustomQuery("RequestNumber == \"12\"");
#region 1st ROW of the QUERY
if (ColumnType(DdlColumn1.SelectedValue) == "Text")
{
if(DdlOperator1.SelectedValue == "==")
{
sb.Append(DdlColumn1.SelectedValue);
sb.Append(DdlOperator1.SelectedValue);
sb.Append("\"" + TxtValue1.Text + "\"");
}
if (DdlOperator1.SelectedValue == "<>")
{
sb.Append(DdlColumn1.SelectedValue);
sb.Append(DdlOperator1.SelectedValue);
sb.Append("\"" + TxtValue1.Text + "\"");
}
if (DdlOperator1.SelectedValue == "LIKE")
{
sb.Append(string.Format("{0}.Contains(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text));
}
if (DdlOperator1.SelectedValue == "NOT LIKE")
{
sb.Append(string.Format("!{0}.Contains(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text));
}
}
if (ColumnType(DdlColumn1.SelectedValue) == "Number")
{
sb.Append(DdlColumn1.SelectedValue);
sb.Append(DdlOperator1.SelectedValue);
sb.Append(TxtValue1.Text);
}
if (ColumnType(DdlColumn1.SelectedValue) == "Date")
{
sb.Append(DdlColumn1.SelectedValue);
sb.Append(DdlOperator1.SelectedValue);
sb.Append(TxtValue1.Text);
}
if (ColumnType(DdlColumn1.SelectedValue) == "Bool")
{
sb.Append(DdlColumn1.SelectedValue);
sb.Append(DdlOperator1.SelectedValue);
sb.Append(TxtValue1.Text);
}
#endregion
return sb.ToString();
}
#endregion
**実行すべき生成された sql **
public IQueryable<RequestBase> GetRequestByCustomQuery(string strql)
{
return _context.RequestBases.Where(strql);
}
? sb.ToString()
"AmmountWithVat=1"
**エラー**
タイプ「RequestBase」に「AmmountWithVat」のプロパティまたはフィールドが存在しません