加入C#中的List列表

时间:2016-05-20 05:32:55

标签: c# sql join

我没有尝试使用连接,但是今天我想使用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

}

1 个答案:

答案 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();