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

Union of two lists in LINQ not working

我有一个方法可以显示数据库中存在的书籍以及借出的书籍。

当用户不 return 这本书时,这本书就变成了 inactive.So 我写了一个 LINQ 查询,新用户可以 select a book.Then 如果用户 select 丢失了 book.He 将抛出一条消息,指出该书不可用。

我在这里使用 Union 查找正在使用的图书和已借出的图书 return。

但是方法中 return 存在重复值。

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;
            }
        }

你正在比较你自己的对象 class 所以你应该在你的 UsageType class 中实现 IEquatable 来告诉 linq how 来比较你的对象。例如:

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 的旧代码将产生意想不到的结果,因为它们使用其他逻辑进行比较,而不是您预期的。