Linq从属性获取与int数组中的任何值匹配的项

时间:2018-10-22 10:58:36

标签: c# linq

我对Linq还是很陌生,但是我敢肯定这可以做到...我有一个简单的C#模型,如下所示:

public class ItemViewModel
{
    public int itemId { get; set; }

    public string itemName { get; set; }

    public int? categoryId { get; set; }
}

在我的控制器(这是.NET MVC)中,我正在使用PetaPoco ORM从数据库中提取数据并将其绑定到模型。最终,我得到了一些List<ItemViewModel>类型的数据。

我想做的是将一个categoryId整数的可选数组传递给控制器​​,并在数据中任何一项的categoryId与传递给控制器​​的任何categoryId匹配的情况下对数据进行过滤。

控制器是这样的:

public List<ItemViewModel> GetData(int?[] categoryIds){

    var data = db.Query<ItemViewModel>("SELECT itemId, itemName, categoryId FROM items;").ToList();

    // So far so good. Getting data as List<ItemViewModel>
    // Now, if there are any categoryIds passed in to the controller, filter the data accordingly:

    if(categoryIds!= null && categoryIds.Any()){
        data = data.Where(x => x.categoryId != null && categoryIds.Contains((int)x.categoryId)).ToList();
    }

    return data
}

但是,我认为应该不会从我的数据集中返回任何结果,所以我认为这与过滤器中的WHERE语句有关。

有人可以建议如何使它工作吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

您可以在Linq中使用内部联接来过滤记录

C#小提琴链接-> https://dotnetfiddle.net/2FWJD0(用lambda更新)

var result = (from a in data 
         join b in categoryIds on a.categoryId  equals b
         select a).Distinct();

使用... Lambda表达式

model.Where(i => catIds.Contains(i.categoryId.Value)).ToList();

答案 1 :(得分:0)

您的方法运行良好!我建议您对数据库的结果进行仔细检查。

以下是测试环境中的示例代码,该示例实际上正在返回经过过滤的数据

[TestClass]
public class Linq
{
    [TestMethod]
    public void LaunchGetData()
    {
        int?[] ids = { 1, 3, 4, 6, null };
        var result = GetData(ids);
    }

    public List<ItemViewModel> GetDermiData()
    {
        var data = new List<ItemViewModel>();

        //Nullable data sample objects
        for (int i = 0; i < 5; i++)
        {
            data.Add(new ItemViewModel
            {
                categoryId = null,
                itemId = i + 11,
                itemName = $"Item {i}"
            });
        }

        //Data sample objects with values
        for (int i = 0; i < 10; i++)
        {
            data.Add(new ItemViewModel
            {
                categoryId = i,
                itemId = i,
                itemName = $"Item {i}"
            });
        }
        return data;
    }

    public List<ItemViewModel> GetData(int?[] categoryIds)
    {
        //I have replaced fetching information from the database with getting dermi data from a function.
        //You may still get your information from the database
        //var data = db.Query<ItemViewModel>("SELECT itemId, itemName, categoryId FROM items;").ToList();
        // So far so good. Getting data as List<ItemViewModel>

        var data = GetDermiData();

        // Now, if there are any categoryIds passed in to the controller, filter the data accordingly:

        if (categoryIds != null && categoryIds.Any())
        {
            data = data.Where(x => x.categoryId != null && categoryIds.Contains((int)x.categoryId)).ToList();
        }

        return data;
    }
}

public class ItemViewModel
{
    public int itemId { get; set; }

    public string itemName { get; set; }

    public int? categoryId { get; set; }
}