根据另一个表中的自定义属性过滤值
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 自定义过滤器不显示使用 [[ ]] 的自定义字段
Forge-Get Item Path 以及 BIM360 文档中的自定义属性