I have an Entity Framework many-to-many relation using a database-first approach.
My classes are :
class User
{
public int UserId {get; set;}
// every User has zero or more Products :
public virtual ICollection<Product> Products {get; set;}
... // other properties
}
class Product
{
public int ProductId {get; set;}
// every Product belongs to zero or more Users:
public virtual ICollection<User> Users {get; set;}
... // other properties
}
class MyDbContext : DbContext
{
public DbSet<User> Users {get; set;}
public DbSet<Product> Products {get; set;}
}
I have a list of productIds in a list lstProductIds
. I need to find out the list of users and their products using linq
If it were SQL, I would do something like this.
var str = String.Join(",", lstProductIds);
str = str.Replace(",", "','");
var conn = new SqlConnection(cs);
conn.Open();
var cmd = new SqlCommand("SELECT a.UserId,b.ProductId FROM Users a JOIN Product b on a.UserId = b.UserId WHERE ProductId onId IN ('" + str + "')", conn);
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
UserDetails.Add(new UserProduct { OrganizationId = Convert.ToString(rdr["UserId "]), ProductId= Convert.ToString(rdr["ProductId"]) });
}
conn.Close();
So I get a list of user Id and ProductId.
I tried something similar in linq but this is ending up giving me just one userId per product.
var UserDetails = db.Products.Where(o => lstProductIds.Contains(o.ProductID.ToString()))
.Select(o => new UserProduct
{ ProductId = o.ID.ToString(),
UserId = o.Users.Select(a => a.UserId.ToString()).FirstOrDefault()
})
.ToList();
I know FirstOrDefault()
is the issue and it's only choosing one user for the product but how do I change it to get me all users?