如何使用Linq的select()过滤实体的属性?

时间:2017-05-02 13:26:47

标签: c# asp.net linq collections

以下是我的DTO。

public class Product
{
    public int PId { get; set; }
    public decimal Price { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }
    //& so on
}

获取产品列表的方法。

 public void GetProducts()
    {
        // below dal method returns collection of products. 
        // I am in need to select only few properties of the Product Entitiy
        var product = dalLayer.GetProductsList().Select(x => x.PId, y => y.Name)

    }

我无法过滤DAL图层中的属性,因为此方法是从多个位置调用的。不同的电话需要不同的属性。

我试过以下的东西。

  var products = dalLayer.GetProductsList().Select(
                    (x, y) => new
                    {
                        x.Id,
                        y.Name
                    });

但这也引发编译时错误

所以如何使用select() ??

过滤产品实体的属性

感谢。

2 个答案:

答案 0 :(得分:1)

尝试以下

 var products = dalLayer.GetProductsList().Select(
                    pr => new
                    {
                        Id =pr.Id,
                        EndDate =pr.EndDate,
                        StartDate=pr.Startdate,
                    });

但请注意您正在创建一个匿名对象

更新

或者,如果您不想要匿名对象,只需创建一个视图

 public class ProductViewDto
 { 
    public int  Id{get;set;}
    public DateTime EndDate {get;set;}
    public DateTime  StartDate{get;set;} 
 }

 var products = dalLayer.GetProductsList().Select(
                        pr => new ProductViewDto
                        {
                            Id =pr.Id,
                            EndDate =pr.EndDate,
                            StartDate=pr.Startdate,
                        });

答案 1 :(得分:0)

你可以使用元组。

在C#7之前tuples

var products = dalLayer.GetProductsList().Select(x => Tuple.Create(x.PId, x.Name)); 

foreach(var p in products)
{
    Console.WriteLine(p.Item1);
    Console.WriteLine(p.Item2);
}

使用C#7。C# 7 new Features

var products = dalLayer.GetProductsList().Select(x => Tuple.Create(x.PId, x.Name));

foreach(var (PId, Name) in products)
{
    Console.WriteLine(PId);
    Console.WriteLine(Name);
}