0
  1. 特定のエンティティをクエリするための式ビルダーまたはクエリ ビルダーを作成しています。エンティティは RequestBase と呼ばれ、このエンティティにはいくつかのプロパティがありますが、Request Base から継承するエンティティが他に 3 つあります。

  2. TPH を使用しているため、識別子列を含むテーブルが 1 つだけ作成され、他のすべてのプロパティは RequestBase テーブルに作成されます。

  3. 問題は、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」のプロパティまたはフィールドが存在しません

4

1 に答える 1

2

以下が機能します。

    public IQueryable<RequestBase> GetRequestByCustomQuery(string strql)
    {
         return _context
               .RequestBases
               .OfType<EcoBonusRequest>()   //
               .Where(strql);
    }

この機能は簡単に適応できます。

    public IQueryable<T> GetRequestByCustomQuery<T>(string strql)
        where T :  RequestBase
    {
         return _context
               .RequestBases
               .OfType<T>()   //
               .Where(strql);
    }

したがって、問題は、BuildQuery()でその型を取得する方法です。簡単ではありませんが、それがあなたの設定方法です。

于 2012-05-31T12:04:21.097 に答える