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;
}
}
您正在比较自己类的对象,因此您应该在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.Equals
和object.GetHashcode()
。如果不这样做,仍然使用非泛型Enumerable
的旧代码将产生意外的结果,因为它们使用其他逻辑来比较您预期的。