1-我 我从CSV文件加载人员列表并将其存储在列表中 我还从db加载人员列表并将其存储在List
中我怎样才能获得他们在csv文件中但不在数据库中的用户?
例如:DB有5个用户(A,B,C,D,E),CSV有4个用户(B,E,Q,P) 代码应该返回用户列表(Q,P)
public class Person
{
public string UserName { get; set; }
public int Age { get; set; }
}
public class App
{
private IEnumerable<Person> usersDb;
private IEnumerable<Person> usersCsv;
public App(int age)
{
usersDb = GetUsersFromDb(age);
usersCsv = GetUsersFromCsv(age);
}
public void AddMissingUsers()
{
var missingUsers = usersCsv.Where(x => !usersDb.Any(y => x.UserName.Trim().ToUpper().
Equals(y.UserName.Trim().ToUpper()))); //I tried this one
// add to database
}
}
其他问题
Ps:我使用实体框架6是否有更好的方法来执行我的代码中显示的任务?从数据库获取所有用户的instate然后检查是否存在?
另一方面,如果我执行相反操作并检查我的csv文件中的每一行(如果存在于数据库中),这也可以是长操作,因为该文件可以包含许多行。
答案 0 :(得分:1)
在这种情况下,您可以使用Except
。
var usersNotInDb = usersCsv.Except(usersDb).ToList();
context.Users.AddRange(usersNotInDb);
context.SaveChanges();
答案 1 :(得分:1)
这可以解决你的问题, 按如下方式更改Person类,
public class Person : IEqualityComparer<Person>
{
public string UserName { get; set; }
public int Age { get; set; }
bool IEqualityComparer<Person>.Equals(Person x, Person y)
{
if (x.UserName == y.UserName)
return true;
return false;
}
int IEqualityComparer<Person>.GetHashCode(Person obj)
{
return base.GetHashCode();
}
}
然后将您的查询更改为
Person p = new Person();
var notInDBList = usersCsv.Except(usersDb, p).ToList();