为什么我不能从linq语句中的select中删除列/属性

时间:2019-12-18 13:23:51

标签: c# entity-framework linq

我要删除不需要显示的列!

基本上,客户只需要看到名字姓氏,因此我只想返回名字姓氏最终用户。

但是,如果我从选择中删除其他道具,我的应用就会中断:

  var product = await _context.Products.OrderBy(p => p.CreatedDate)
                .Select(x => new Product
                {
                    ProductId = x.ProductId,
                    GroupId = x.GroupId,
                    ProductStatus = x.ProductStatus,
                    Title = x.Title,
                    Price = x.Price
                }).FirstOrDefaultAsync(u => u.ProductId == dbObj.Id && u.GroupId == ProductGroup.Drinks && u.ProductStatus.Id == (int)ProductStatusEnum.Active);

我想要这样的东西:

  var product = await _context.Products.OrderBy(p => p.CreatedDate)
                .Select(x => new Product
                {
                    Title = x.Title,
                    Price = x.Price
                }).FirstOrDefaultAsync(u => u.ProductId == dbObj.Id && u.GroupId == ProductGroup.Drinks && u.ProductStatus.Id == (int)ProductStatusEnum.Active);

在经典(T-SQL)SQL语句中,我应该能够在WHERE中有列,但也不能在SELECT中有列,而在LINQ中看起来我必须在{{1}中有列},如果我在SELECT中使用它们。

谢谢

欢呼

2 个答案:

答案 0 :(得分:1)

您的查询未选择列,而是在选择要为其设置属性值的新Product对象。在第二种情况下,您只需要设置TitlePrice属性,其他将是默认值。

您可能要查看anonymous types,例如:

.Select(x => new { Title = x.Title, Price = x.Price });

答案 1 :(得分:1)

只需更改Linq语句的顺序即可。首先使用Where进行过滤,然后再调用Select并使用匿名对象将其投影到:

var product = await _context.Products
                 .Where(u => u.ProductId == dbObj.Id 
                          && u.GroupId == ProductGroup.Drinks 
                          && u.ProductStatus.Id == (int) ProductStatusEnum.Active)
                 .OrderBy(p => p.CreatedDate)
                 .Select(x => new
                 {
                     Title = x.Title,
                     Price = x.Price
                 }).FirstOrDefaultAsync();

这将创建具有2个属性productTitle的匿名类型(Price)。


如果您不想使用匿名类型,另一个选择是创建一个仅包含所需属性的类。

public class ProductSummary
{
    public string Title { get; set; }
    public decimal Price { get; set; }                
}

然后您可以选择具体的类:

 .Select(x => new ProductSummary { Title = x.Title, Price = x.Price })