根据另一个表中的自定义属性过滤值

Posted

技术标签:

【中文标题】根据另一个表中的自定义属性过滤值【英文标题】:Filter values based on custom attribute in another table 【发布时间】:2019-08-21 07:20:18 【问题描述】:

我有两个表 DefaultAttributes 和 CustomAttributes。

DefaultAttributeTable: 
1. Id
2. Product
4. Description

CustomAtrributeTable:
1. Id
2. DefaultAttributeMappingId(FK from DefaultAttributeTable)
3. CustomAtrributeName
4. CustomeAttributeValue

用户输入的条目

    用户更新值产品 -> 蔬菜、描述 -> 家居用品、IsOrganic(已创建自定义属性)-> True 和 IsDisposable(已创建自定义属性)-> True

    用户更新值 Product -> Fruits, Description -> House Hold Item, IsOrganic(Custom Attribute created) -> True and IsDisposable(Custom Attribute created) -> True

    用户更新值 Product -> Plastic, Description -> House Hold Item, IsOrganic(Custom Attribute created) -> False and IsDisposable(Custom Attribute created) -> False

那么表格中的值就会更新

默认属性表:

自定义属性表:

我想组合这两个表并选择 Id、product、IsOrganic、IsDisposable 并根据 isorganic 列过滤值。此外,自定义属性列名称应取自 CustomAtrributeTable。请向我建议如何在 SQL 和 Linq Query 中实现它。过滤后的值应该是

【问题讨论】:

@添加了一个答案,你可能想看看 【参考方案1】:

你可以在 SQL 中试试这个

select DA.Id, DA.Product, CA.CustomeAttributeValue as IsOrganic  
from DeafaultAtrributeTable as DA inner join CustomAttributeTable as CA
on DA.Id = CA.DefaultAttributeMappingId

在 LINQ 中

var query =
   from DA in DeafaultAtrributeTable 
   join CA in CustomAttributeTable  on DA.ID equals CA.DefaultAttributeMappingId
   where CA.CustomeAttributeValue == true
   select new  Id = DA.Id, Product = DA.Product, IsOrganic = CA.CustomeAttributeValue ;

或LINQ扩展方法是

  var query = DeafaultAtrributeTable     // your starting point - table in the "from" statement
      .Join(CustomAttributeTable  , // the source table of the inner join
         DA => DA.ID,        // Select the primary key (the first part of the "on" clause in an sql "join" statement)
         CA => CA.DefaultAttributeMappingId,   // Select the foreign key (the second part of the "on" clause)
        (DA, CA) => new  Id = DA.Id, Product = DA.Product, IsOrganic = 
     CA.CustomeAttributeValue ) // selection 
    .Where(RES => RES.CA.CustomeAttributeValue == true);    // where statement

【讨论】:

抱歉,我之前的要求并不清楚。请检查我更新的查询【参考方案2】:

试试这个

public class Filtered

    public int ProductId  get; set; 
    public string ProductName  get; set; 
    public bool? IsOrganic  get; set; 
    public bool? IsDisposable  get; set; 


var result = defaultAttributeTable.Join(customAtrributeTable, DAT => DAT.Id, CAT => CAT.DefaultAttributeTableId, (DAT, CAT) => 
            new Filtered 
            
//your join with null values for opposing isdisposable and isorganic
                ProductId = DAT.Id,
                IsDisposable = CAT.CustomAtrributeName == "IsDisposable" ? (bool?)CAT.CustomeAttributeValue : null,
                IsOrganic = CAT.CustomAtrributeName == "IsOrganic" ? (bool?)CAT.CustomeAttributeValue : null,
                ProductName = DAT.Product
            ).GroupBy(q => q.ProductId) //group it by productid
              .Select(q =>
                   new Filtered
                   
//this will flatten opposing isorganic and isdisposable
                       ProductId = q.Key,
                       IsDisposable = q.First(e => e.IsDisposable.HasValue).IsDisposable.Value,
                       IsOrganic = q.First(e => e.IsOrganic.HasValue).IsOrganic.Value,
                       ProductName = q.First(e => e.ProductId == q.Key).ProductName
                   ).ToList();

【讨论】:

感谢您的更新。如果自定义属性名称是动态的并且我们不知道它会根据用户产品而改变。在那种情况下如何获取详细信息 @hariprasath 你会使用反射,虽然它会慢很多,.GetType().GetProperty("PropertyName").GetValue() 你需要答案吗? 我的回答对您的查询有帮助吗?如果有,请将其标记为答案和/或有帮助 它很有帮助,但我想知道如何使用 DB 中新创建的属性值动态创建类 @hariprasath 稍后会提供答案

以上是关于根据另一个表中的自定义属性过滤值的主要内容,如果未能解决你的问题,请参考以下文章

元数据库中的 SQL 自定义过滤器不显示使用 [[ ]] 的自定义字段

java实现多表的自定义查询。

无法根据 Azure 流分析中的标头属性筛选消息

Forge-Get Item Path 以及 BIM360 文档中的自定义属性

R_Studio(癌症)以等宽类别值自定义类别值等频类别值(分为5类)

如何对实体的自定义属性进行谓词