我正在尝试编写一个linq查询,该查询只会将实体对象中的某些列返回到列表对象中。
下面是我生成错误的代码(无法将匿名类型的通用列表隐式转换为TBLPROMOTION类型的通用列表):
IQueryable<TBLPROMOTION> matches = webStoreContext.TBLPROMOTION.Include("TBLSTORE").Include("LKPROMOTIONTYPE");
List<TBLPROMOTION> promotionInfo = null;
promotionInfo = (from p in matches
orderby p.PROMOTION_NM descending
select new { p.EFFECTIVE_DT, p.EXPIRE_DT, p.IS_ACTIVE,
p.PROMOTION_DESC, p.PROMOTION_ID, p.PROMOTION_NM }).ToList();
实现这一目标的最佳方式是什么?我不想在这种情况下执行“select p”并返回与查询关联的所有列。
提前谢谢, 比利答案 0 :(得分:5)
你不能var promotionInfo = ()
获取匿名类型列表吗?
答案 1 :(得分:4)
好的,基本上你不能将Anonymous类型强制转换为TBLPROMOTION这样的已知类型。
当然,您可以说var promotionInfo =
然后获得IEnumerable<{Anonymoustype}>
并使用它来做,您想要对promotionInfo
做些什么。
另外,我个人更喜欢linq查询的流利版本,眼睛容易,编程节食好,至少对我来说:)。
var promotionInfo = matches
.OrderByDescending( p => p.PROMOTION_NM)
.Select( p => new { p.EFFECTIVE_DT,
p.EXPIRE_DT,
p.IS_ACTIVE,
p.PROMOTION_DESC,
p.PROMOTION_ID,
p.PROMOTION_NM})
.ToList();
答案 2 :(得分:1)
如果您要从L2E查询转移到已定义的类型,则可能需要介于两者之间。我没有尝试编译这个,但是像:
List<TBLPROMOTION>
promotions = new List<TBLPROMOTION>
();
var results = from p in matches
orderby p.PROMOTION_NM descending
select new
{
p.EFFECTIVE_DT,
p.EXPIRE_DT,
p.IS_ACTIVE,
p.PROMOTION_DESC,
p.PROMOTION_ID,
p.PROMOTION_NM
};
foreach (var v in results)
{
promotions.Add(new TBLPROMOTION(v.EFFECTIVE_DT, v.EXPIRE_DT, v.IS_ACTIVE,
v.PROMOTION_DESC, v.PROMOTION_ID, v.PROMOTION_NM));
}
根据以下评论,您可以尝试以下方式:
<TBLPROMOTION>
....... 对不起:请阅读顶部的补充说明。
你确定TBLPROMOTION对象需要你没有遗漏的任何字段(而不是说“select p”)吗?另外,感觉你的TBLPROMOTION对象将为那些跳过的字段设置属性(因此分配内存),为什么不使用匿名类型或设置仅包含所需属性的辅助类?
答案 3 :(得分:1)
@Billy,以下代码为我工作。
List<TBLPROMOTION> promotionInfo =
(from p in matches
orderby p.PROMOTION_NM descending
select new TBLPROMOTION(p.EFFECTIVE_DT, p.EXPIRE_DT, p.IS_ACTIVE,
p.PROMOTION_DESC, p.PROMOTION_ID, p.PROMOTION_NM)
).ToList();
答案 4 :(得分:0)
select new TBLPROMOTION {.....
而不是
select new {.....
答案 5 :(得分:0)
List<TBLPROMOTION> promotionInfo = null;
promotionInfo = (from p in matches
orderby p.PROMOTION_NM descending
select new TBLPROMOTION { COL1 = p.EFFECTIVE_DT, COL2 = p.EXPIRE_DT, COL3 = p.IS_ACTIVE... }).ToList();
其中COL1,COL2,...是您希望填充的TBLPROMOTION
上的属性的名称。
答案 6 :(得分:0)
如果您想要表格的一个子集,您有两个选项:
@Fredou提到选择新的TBLPROMOTION {...}
其他方法是创建一个具有确切属性的自定义DTO。选择它们就像:
列出promotionInfo = ... 选择新的TBLPROMOTION_DTO { Effective_dt = ... }
HTH