LINQ 中两个列表的联合不起作用

本文关键字:列表 不起作用 两个 LINQ | 更新日期: 2023-09-27 18:35:42

我有一个方法,我将显示数据库中存在的书籍和借阅的书籍。

当用户不归还图书时,图书将变为非活动状态。因此,我编写了一个 LINQ 查询,新用户可以在其中选择一本书。然后,如果用户选择丢失的书籍。他将收到一条消息,说这本书不可用。

在这里,我利用联盟来寻找活跃的书籍和借出但不归还的书籍。

但是重复值在方法中返回。

public IEnumerable<UsageType> GetUsageType(int BookID = 0)
        {
            _db.Configuration.ProxyCreationEnabled = false;
            List<UsageType> Uresult = new List<UsageType>();
            List<UsageType> result = new List<UsageType>();
            try
            {
                if (BookID == 0)
                {
                    result = (from Usage in _db.USAGE_TYPE
                              where Usage.IS_ACTIVE == true
                              select new
                              {
                                  UsageTypeId = Usage.USAGE_TYPE_ID,
                                  UsageTypeName = Usage.USAGE_TYPE_NAME,
                                  IsActive = Usage.IS_ACTIVE
                              }).AsEnumerable()
                                          .Select(x => new UsageType
                                          {
                                              UsageTypeId = x.UsageTypeId,
                                              UsageTypeName = x.UsageTypeName,
                                              IsActive = x.IsActive.HasValue ? x.IsActive.Value : false
                                          }).Distinct().ToList();
                }
                else
                {
                    result = (from Usage in _db.USAGE_TYPE
                              where Usage.IS_ACTIVE == true
                              select new
                              {
                                  UsageTypeId = Usage.USAGE_TYPE_ID,
                                  UsageTypeName = Usage.USAGE_TYPE_NAME,
                                  IsActive = Usage.IS_ACTIVE
                              }).AsEnumerable()
                                     .Select(x => new UsageType
                                     {
                                         UsageTypeId = x.UsageTypeId,
                                         UsageTypeName = x.UsageTypeName,
                                         IsActive = x.IsActive.HasValue ? x.IsActive.Value : false
                                     }).ToList();
                    var savedUsagetype = (from Usage in _db.USAGE_TYPE
                                          join usageCategory in _db.USAGE_CATEGORY on Usage.USAGE_TYPE_ID equals usageCategory.USAGE_TYPE_ID
                                          join book_usage in _db.BOOK_USAGE
                                          on usageCategory.USAGE_CATEGORY_ID equals book_usage.USAGE_CATEGORY_ID
                                          where book_usage.Book_ID == BookID 
                                          select new
                                          {
                                              UsageTypeId = Usage.USAGE_TYPE_ID,
                                              UsageTypeName = Usage.USAGE_TYPE_NAME,
                                              IsActive = Usage.IS_ACTIVE
                                          }).AsEnumerable()
                                       .Select(x => new UsageType
                                       {
                                           UsageTypeId = x.UsageTypeId,
                                           UsageTypeName = x.UsageTypeName,
                                           IsActive = x.IsActive.HasValue ? x.IsActive.Value : false
                                       }).ToList();

                Uresult= result.Union(savedUsagetype).Distinct().ToList();
                }
                return Uresult;
            }
            catch (Exception ex)
            {                
                return null;
            }
        }

LINQ 中两个列表的联合不起作用

您正在比较自己类的对象,因此您应该在UsageType类中实现IEquatable,以告诉 linq 如何比较您的对象。例如:

public class UsageType : IEquatable<UsageType>
{
    public int UsageTypeId {get; set;}
    ...
    public bool Equals(UsageType other)
    {
       return this.UsageTypeId == other.UsageTypeId;
    }
    public override bool Equals(object other)
    {
       return this.UsageTypeId == ((UsageType)other).UsageTypeId;
    }
    public override int GetHashCode()
    { 
       return this.UsageTypeId.GetHashCode();
    }
}

现在您可以使用 UsageType 来获取 IEqualityComparer<UsageType> 的实例:

Uresult = result.Union(savedUsageType,IEqualityComparer<UsageType>.Default).ToList();

注意:始终覆盖object.Equalsobject.GetHashcode()。如果不这样做,仍然使用非泛型Enumerable的旧代码将产生意外的结果,因为它们使用其他逻辑来比较您预期的。