【问题标题】:Merging data from two lists conditionally有条件地合并来自两个列表的数据
【发布时间】:2012-05-24 14:04:21
【问题描述】:

有条件地合并两个列表中的数据

表结构如下

MobileID   ModelID   ManufacturerID    IsApproved

其中 IsApproved 是布尔值,

当新的手机录入数据库时​​,它会向经理审批,直到它的IsApproved值为0,当它被批准时IsApproved值将变为1。

我想做如下

我正在使用下面写的第一个查询获取所有已批准移动设备的列表

现在的问题是我必须根据 2 个条件显示所有手机

1) 如果存在具有相同模型ID 和制造商ID 的手机(意味着规范已更新),那么它的 IsApproved 字段将变为 0 --> 不在数据库中,而是在列表中仅用于显示目的)

2) 如果 Mobile 是新的,则其 IsApproved 状态应为 0

我应该怎么做才能有条件地合并这两个列表?

我的 LINQ 查询如下

var listApproved = objMobile.MobileLists.where(mb => mb.IsApproved == true).toList();
var listUnApproved = objMobile.MobileLists.where(mb => mb.IsApproved == false).toList();

假设表格数据如下

MobileID    ModelID     ManufacturerID     IsApproved
01            mod1             manu1               1
02            mod2             manu2               1
03            mod3             manu3               1
04            mod1             manu1               0
05            mod5             manu5               0
06            mod6             manu6               0
07            mod2             manu2               0

我希望列表为

MobileID    ModelID     ManufacturerID     IsApproved
01            mod1            manu1            0
02            mod2            manu2            0
03            mod3            manu3            1
05            mod5            manu5            0
05            mod6            manu6            0

【问题讨论】:

  • 您的列表似乎是错误的“如果 modelId 和 ManuId 相同,则 IsApproved = 0”,但 MobileId 2 和 Mobile 3 都具有相同的型号和 Manu id,并且您的列表在 IsApproved 中显示为 1
  • 我应该编辑数据以便更好地理解...

标签: c# .net linq linq-to-entities


【解决方案1】:

好吧,首先让我们将您的列表缓存在内存中,以节省我们多次获取它的时间:

var listOfAllMobiles = objMobile.MobileLists.ToList();

现在让我们按照你的逻辑来获取所有手机:

var mobileList = listOfAllMobiles
    .Select(m => new Mobile
                 {
                     IsApproved = m.IsApproved == true && !listOfAllMobiles
                         .Any(l => l.ModelID == m.ModelID
                             && l.ManufacturerID == m.ManufacturerID
                             && l.MobileID != m.MobileID),
                     MobileID = m.MobileID,
                     ModelID = m.ModelID,
                     ManufacturerID = m.ManufacturerID
                 })
    .ToList();

编辑: 上面的代码将设置正确的值,但它不会过滤掉具有重复的ManufacturerIdModelID 的手机。为此,您必须使用额外的 foreach,如下所示:

var displayMobileList = new List<Mobile>();

foreach(var mobile in mobileList
    .Where(m => !displayMobileList
        .Any(m2 => m2.ModelID == m.ModelID 
            && m2.ManufacturerID == m.ManufacturerID)))
{
    displayMobileList.Add(mobile);
}

【讨论】:

  • 它缺少什么吗?因为它在 .Where(m => listOfAllMobiles) 处给出错误
  • 现在试试,不知道结果如何!
  • 它在主查询中的 && 处给出错误,是否意味着单个 & [逻辑 AND] 运算符?
  • 是的,它给出了以下错误 >
猜你喜欢
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
相关资源
最近更新 更多