我要删除不需要显示的列!
基本上,客户只需要看到名字和姓氏,因此我只想返回名字和姓氏最终用户。
但是,如果我从选择中删除其他道具,我的应用就会中断:
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
中使用它们。
谢谢
欢呼
答案 0 :(得分:1)
您的查询未选择列,而是在选择要为其设置属性值的新Product
对象。在第二种情况下,您只需要设置Title
和Price
属性,其他将是默认值。
您可能要查看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个属性product
和Title
的匿名类型(Price
)。
如果您不想使用匿名类型,另一个选择是创建一个仅包含所需属性的类。
public class ProductSummary
{
public string Title { get; set; }
public decimal Price { get; set; }
}
然后您可以选择具体的类:
.Select(x => new ProductSummary { Title = x.Title, Price = x.Price })