Пользовательский запрос в геттере для возврата определенного значения, если отсутствует часть составного ключа - PullRequest
1 голос
/ 18 апреля 2019

У меня есть таблица ( Interaction_Data ) с составным ключом, состоящим из 5 полей данных. Четыре из этих ключей предоставляются в качестве внешнего ключа другим классом ( Взаимодействия ). Это дает мне проблему с отсутствующим ключом в моей таблице Interaction_Data , поэтому мое поле данных всегда возвращает первый результат, так как оно возвращает несколько результатов.

В моей модели InteractionData я пытаюсь вызвать SQL-запрос в моем геттере (см. « DataValueNetCost » ниже). Я хочу, чтобы мой метод получения возвращал определенное значение на основе ввода из другого поля в моей таблице. А именно, я хочу получить:

DATA_VALUE, когда DATA_DEF_ID = "NET_COST"

Модель взаимодействий:

[Table("INTERACTIONS")]
    public partial class Interaction {
        // NOTE: The primary key for the INTERACTIONS table is a composite key
        //       consisting of:
        //           - ACCOUNT_ID
        //           - CONTACT_DATE
        //           - CONTACT_SEQ
        //           - PAGE

        [Key]
        [Column("ACCOUNT_ID", Order = 0)]
        public int ACCOUNT_ID { get; set; }

        [Key]
        [Column("CONTACT_DATE", Order = 1)]
        public DateTime CONTACT_DATE { get; set; }

        [Key]
        [Column("CONTACT_SEQ", Order = 2)]
        public int CONTACT_SEQ { get; set; }

        [Key]
        [Column("PAGE", Order = 3)]
        public int PAGE { get; set; }

        [ForeignKey("ACCOUNT_ID,CONTACT_DATE,CONTACT_SEQ,PAGE")]
        public InteractionData InteractionData { get; set; }
    }

Модель InteractionData:

[Table("INTERACTION_DATA")]
    public partial class InteractionData {
        // NOTE: The primary key for the INTERACTION_DATA table is a composite key
        //       consisting of:
        //           - ACCOUNT_ID
        //           - CONTACT_DATE
        //           - CONTACT_SEQ
        //           - PAGE
        //           - DATA_DEF_ID

        [Key]
        [Column("ACCOUNT_ID", Order = 0)]
        public int ACCOUNT_ID { get; set; }

        [Key]
        [Column("CONTACT_DATE", Order = 1)]
        public DateTime CONTACT_DATE { get; set; }

        [Key]
        [Column("CONTACT_SEQ", Order = 2)]
        public int CONTACT_SEQ { get; set; }

        [Key]
        [Column("PAGE", Order = 3)]
        public int PAGE { get; set; }

        // IN THE DB TABLE THIS IS ALSO PART OF THE COMPOSITE KEY
        // BUT DATA_DEF_ID DOES NOT EXIST IN THE INTERACTIONS TABLE
        // SO I CAN'T NAME IT A PART OF THE COMPOSITE KEY
        [Column("DATA_DEF_ID")]
        [StringLength(60)]
        public string DATA_DEF_ID { get; set; }

        [Column("DATA_VALUE")]
        [StringLength(400)]
        public string DATA_VALUE { get; set; }

        //// Since we are using custom getters and setters we need a backing field
        private string _dataValueNetCost;

        [StringLength(400)]
        public string DataValueNetCost {
            get {
                // We need to get the specific DATA_VALUE when DATA_DEF_ID is "NET_COST"
                // This next section will call a SQL query to get this field and return it.
                SourceCodeContext db = new SourceCodeContext();

                IEnumerable<InteractionData> netCost = db.InteractionsData.SqlQuery(
                    "SELECT DATA_VALUE FROM PBDS.INTERACTION_DATA as id WHERE id.Account_Id = '@p0' AND id.CONTACT_DATE = '@p1' AND " +
                    "id.CONTACT_SEQ = '@p2' AND id.PAGE = '@p3' AND id.DATA_DEF_ID = '@p4'",
                    ACCOUNT_ID, CONTACT_DATE, CONTACT_SEQ, PAGE, "NET_COST"
                );

                string returnString = netCost.ToString();

                return returnString;
            }
            set {
                _dataValueNetCost = value;
            }
        }
    }

В настоящее время результатом этого является DataValueNetCost имеет значение первой записи DATA_VALUE, возвращенной из запроса, и для составного ключа требуется только 4 из 5 ключей.

Я получаю данные на основе вызова Odata, который отправляет 4 первичных ключа в Interactions. Мне нужно отобразить InteractionData.DataValueNetCost на экране в моем представлении.

Как я могу вернуть DATA_VALUE, когда DATA_DEF_ID = "NET_COST" в текстовое поле моего просмотра?

...