我没有尝试使用连接,但是今天我想使用join修复一个复杂的情况,我有一个数据在下面列出了示例。我也发表评论。怎么进一步?
namespace JoinsApplication
{
class Program
{
static void Main(string[] args)
{
List<Category> categories = new List<Category>()
{
new Category(){Name="Beverages", ID=001,Products =new List<Product>(){new Product{Name="Cola", CategoryID=001},new Product{Name="Tea", CategoryID=001} } },
new Category(){ Name="Condiments", ID=002,Products =new List<Product>(){new Product{Name="Mustard", CategoryID=002},new Product{Name="Pickles", CategoryID=003} } },
new Category(){ Name="Vegetables", ID=003,Products =new List<Product>(){new Product{Name="Carrots", CategoryID=003},new Product{Name="Melons", CategoryID=003} } },
new Category() { Name="Grains", ID=004,Products =new List<Product>(){new Product{Name="Carrots", CategoryID=003},new Product{Name="Melons", CategoryID=003} } },
new Category() { Name="Fruit", ID=005,Products =new List<Product>(){new Product{Name="Peaches", CategoryID=005},new Product{Name="Melons", CategoryID=005} } }
};
//filter data using join, i want to filter data and want a condition on cat.ID and Product.CategoryID, but Products property is not accessible using category alias.
//var u= from cat in categories join product in cat.Products on product.CategoryID equels cat.ID select cat.Name, product.Name;
}
}
#region Join Demonstration data
public class Product
{
public string Name { get; set; }
public int CategoryID { get; set; }
}
public class Category
{
public string Name { get; set; }
public int ID { get; set; }
public List<Product> Products { get; set; }
}
// Specify the first data source.
#endregion
}
答案 0 :(得分:2)
简单。您只需要一个完整的产品列表即可完成此操作,这可以通过SelectMany:
来实现var uu = (from cat in categories
join product in categories.SelectMany(p => p.Products)
on cat.ID equals product.CategoryID
select new
{
CategoryName = cat.Name,
ProductName = product.Name
}).ToList();
编辑(使用Lambda):
var uuLambda = categories.Join(categories.SelectMany(p => p.Products),
cat => cat.ID, prod => prod.CategoryID,
(cat, prod) => new { CategoryName = cat.Name, ProductName = prod.Name }).ToList();
以下根据您的评论,无论如何都不是一个好主意,而且不可读:
var uuWhere = categories.SelectMany(p => p.Products).
Select(prod => new { ProductName = prod.Name,
CategoryName = categories.Where(x => x.ID == prod.CategoryID).
Select(x => x.Name).FirstOrDefault() }).ToList();