LinQ根据状态删除产品

时间:2020-02-14 09:37:25

标签: c# linq xamarin.forms

所以我对显示草稿产品的API有问题。

因此,我的解决方案是在设置视图之前遍历列表并删除任何草拟产品。

但是我对LinQ并不熟悉,所以我不完全确定该怎么做,或者用什么短语ID来查看更多内容

这是我的尝试

尝试1:仅删除1个产品(如果我说“任意” |它只是说不能将布尔值转换为产品)


  var listitem = (from itm in products where itm.status == "draft" select itm).FirstOrDefault();
                products.Remove(listitem);
  //Also tried something like

.Where(a => a.status == "draft")

尝试2:找到项目,然后删除所有内容

       foreach (var item in products)
                {
                    if (item.status == "draft")
                    {
                        products.Remove(item);
                    }
                }
      productsListView.FlowItemsSource = products;

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

怎么样

productsListView.FlowItemsSource = products.Where(p => p.status!=“草稿”);

这行吗?

答案 1 :(得分:2)

我对显示草稿产品的API有问题。因此,我的解决方案是...删除任何草稿产品。

不确定您想要什么。您只想显示起草的产品吗?还是要显示所有非草稿产品?也许您想从原始清单中删除起草的产品?

仅显示起草的产品

var draftedProducts = products.Where(product => product.Status == "draft);

换句话说:从产品的原始顺序开始,请确保其属性状态值等于“草稿”的产品

如果遵循以下约定,通常更容易理解:序列(集合,列表,数组)是复数名词。序列的元素是单数名词。 =>之前的部分代表序列的一个元素,=>之后的部分代表对序列的元素起作用的表达式

仅显示未起草的产品

如果您了解上一尝试,则不会难于理解:

 var nonDraftedProducts = products.Where(product => product.Status != "draft);

从原始收藏中删除起草的产品

重要的是要理解:LINQ永远不会改变您的输入序列。 LINQ不会在输入序列中添加或删除项目,也不会更改任何属性。

如果要从输入序列中删除项目,则必须遍历LINQ结果并删除项目。

var draftedProducts = products.Where(product => product.Status == "draft).ToList();
foreach (var draftedProduct in draftedProducts)
{
    products.Remove(draftedProduct);
}

或将其从数据库中删除:

using (var dbContext = new ProductsDbContext)
{
    var draftedProducts = dbContext.Products
        .Where(product => product.Status == "draft)
        .ToList();
    dbContext.Products.RemoveRange(draftedProducts);
}

或者,如果您使用SQL访问产品:

var allProducts = myDatabase.GetAllProducts();
var draftedProducts = dbContext.Products
        .Where(product => product.Status == "draft)
        .ToList();
foreach (var draftedProduct in draftedProducts)
{
    myDatabase.RemoveProduct(draftedProduct);
}