【发布时间】:2020-03-11 16:05:24
【问题描述】:
我想知道我的问题是否有比这个更好的解决方案 https://entityframeworkcore.com/knowledge-base/44877455/get-all-columns-except-one-in-efcore
我有几个模型有很多列(比如说 20 个),而且很少有列很重 - 斑点。 自然,我希望有一种方法可以轻松地检索数据(它们的列表) - 即排除这几列。 到目前为止,唯一可行的方法是上面链接中提出的方法,即
原型号:
{
public Rating() { }
public int IdRating { get; private set; }
public string IdUser { get; set; }
public decimal Value { get; private set; }
public string Comment { get; private set; }
public bool IsEnabled { get; set; }
public int IdCorrespondent { get; private set; }}
然后是更轻的版本
public class RatingView
{
public Rating() { }
public int IdRating { get; private set; }
public decimal Value { get; private set; }
}
数据检索是
public List<RatingView> ListRatings()
{
return _context.Ratings.Select(x => new RatingView
{
IdRating = x.IdRating ,
Value = x.Value ,
}).ToList();
}
第一个问题是这样设置的列太多,其次有几个类似的类,所以解决方案不是很好,并且容易出错,以便将来更改模型。 Automapper 看起来是个不错的方法,但生成的查询并不是最优的——所有的列都被检索了。
谢谢, 阿布斯
【问题讨论】:
-
视情况而定。但我会考虑将访问较少的列移动到单独的表中,并在真正需要时使用
join。比如说,如果使用额外(重)列的轻量查询的 1/100 倍——这可能是一个好方法。否则,您必须使用select编写手动预测。 -
AM 的设计目的是针对不同的情况使用不同的 DTO。话虽如此,docs.automapper.org/en/latest/….
-
感谢 Crypt32,在数据库级别拆分表是最好的方法,但不幸的是,它仅在数据库设计阶段可用(在我的情况下继承)。我没有完全理解的第二个建议。您是否建议类似 var All=_context.Ratings.Where(...); var query=All.Select(x => new RatingView { IdRating = x.IdRating , Value = x.Value , }) 所以最后我看不出它与最初的解决方案有何不同?问候,阿布斯
-
感谢 Lucian,有趣的是,但在 DbSet 上使用 .ProjectTo 似乎会产生最佳查询!我会再做一些测试,但看起来很有希望!
标签: entity-framework ef-core-3.0