LINQ在List中获取项目

本文关键字:获取 项目 AttributeValuePair List LINQ | 更新日期: 2023-09-27 18:12:37

我有一个表在我的数据库中,除了其他列(其中之一是一个UniqueIdentifier),我也有一个列,我有一个JSON数组字符串的值像这样(格式化):

[
    {
        "AttributeId": "fe153d69-8ac1-6e0c-8793-ff0000804eb3",
        "AttributeValueId": "64163d69-8ac1-6e0c-8793-ff0000804eb3"
    },
    {
        "AttributeId": "00163d69-8ac1-6e0c-8793-ff0000804eb3",
        "AttributeValueId": "67163d69-8ac1-6e0c-8793-ff0000804eb3"
    }
]

然后我有这个AttributeValuePair类,它将允许我在代码上读取这些数据:

public class AttributeValuePair
{
    public AttributeValuePair();
    public Guid AttributeId { get; set; }
    public Guid AttributeValueId { get; set; }
}

每当我从这个表中获得一个项目列表时,我希望能够仅基于一个AttributeValueId过滤结果数组,并仅获得匹配的项目,而不依赖于任何其他属性的值。

既然在代码上,要读取这些属性集合,我必须有一个List<AttributeValuePair>,我如何在LINQ中获得特定AttributeValueId存在的项目?

List<AttributeValuePair> attributeValuePairs = serializer.Deserialize<List<AttributeValuePair>>(item.Variant);

我已经沉浸在其中两个小时了,似乎找不到逃避的办法。

编辑

更清楚的问题,我要做的是,从一个List<ProductVariation>,得到属性"部分"的可能值,当属性"天"是指定的值。我在使用serializer构建LINQ语句时遇到了很多麻烦。

//This code is wrong, I know, but I'm trying to show what I want
result = model.ProductVariations.Find(x, new {serializer.Deserialize<List<AttributeValuePair>>(item.Variant).Where(valuePair => valuePair.AttributeId == attributeId)});

LINQ在List<AttributeValuePair>中获取项目

你能试试吗

attributeValuePairs.Where(valuePair => valuePair.AttributeId == new Guid("SomeValue"));

这个问题的答案实际上比之前预期的要简单得多:

public string SelectedVariation(string mealsAttribute, string portionsAttribute, string product)
{
    Guid productId = new Guid(product);
    CatalogManager catalogManager = CatalogManager.GetManager();
    EcommerceManager ecommerceManager = EcommerceManager.GetManager();
    RegisterOrderAccountFormModel model = new RegisterOrderAccountFormModel();
    model.Product = catalogManager.GetProduct(productId);
    List<ProductVariation> productVariationsCollection = catalogManager.GetProductVariations(productId).ToList();
    //This is the really interesting part for the answer:
    return productVariationsCollection.Where(x => x.Variant.ToLower().Contains(mealsAttribute.ToLower()) && x.Variant.ToLower().Contains(portionsAttribute.ToLower())).FirstOrDefault().Id.ToString();
}