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.Equals
和 object.GetHashcode()
。如果不这样做,仍然使用非泛型 Enumerable
的旧代码将产生意想不到的结果,因为它们使用其他逻辑进行比较,而不是您预期的。
我有一个方法可以显示数据库中存在的书籍以及借出的书籍。
当用户不 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.Equals
和 object.GetHashcode()
。如果不这样做,仍然使用非泛型 Enumerable
的旧代码将产生意想不到的结果,因为它们使用其他逻辑进行比较,而不是您预期的。