我对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
语句有关。
有人可以建议如何使它工作吗?
非常感谢。
答案 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; }
}