dot*_*oob 29 c# linq linq-to-entities
我有一个从EF模型返回数据的方法.
我收到了上述消息,但我无法告诉我们如何规避问题.
public static IEnumerable<FundedCount> GetFundedCount()
{
var today = DateTime.Now;
var daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);
var day1 = DateTime.Now.AddDays(-1);
var day31 = DateTime.Now.AddDays(-31);
using (var uow = new UnitOfWork(ConnectionString.PaydayLenders))
{
var r = new Repository<MatchHistory>(uow.Context);
return r.Find()
.Where(x =>
x.AppliedOn >= day1 && x.AppliedOn <= day31 &&
x.ResultTypeId == (int)MatchResultType.Accepted)
.GroupBy(x => new { x.BuyerId, x.AppliedOn })
.Select(x => new FundedCount(
x.Key.BuyerId,
x.Count() / 30 * daysInMonth))
.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
FundedCount不是EF enity,MatchHistory是,所以无法理解它为什么抱怨.
所有建议都赞赏.
Yuc*_*uck 51
它抱怨的原因是因为它不知道如何将您Select()转换为SQL表达式.如果您需要对不是实体的POCO进行数据转换,则应首先从EF获取相关数据,然后将其转换为POCO.
在你的情况下,它应该像ToList()之前调用一样简单:
return r.Find()
.Where(x => x.AppliedOn >= day1 && x.AppliedOn <= day31 &&
x.ResultTypeId == (int)MatchResultType.Accepted)
.GroupBy(x => new { x.BuyerId, x.AppliedOn })
.ToList() // this causes the query to execute
.Select(x => new FundedCount(x.Key.BuyerId, x.Count() / 30 * daysInMonth));
Run Code Online (Sandbox Code Playgroud)
但是要小心,并确保ToList()尽可能地限制返回的数据集的大小,这样就不会尝试将整个表加载到内存中.
Rap*_*aus 12
消息很明确:linq to entities不支持没有无参数ctor的对象.
所以
解决方法1
枚举之前(或使用中间匿名类型并枚举那个)
.ToList()
.Select(x => new FundedCount(
x.Key.BuyerId,
x.Count() / 30 * daysInMonth))
.ToList();
Run Code Online (Sandbox Code Playgroud)
溶液2
将无参数ctor添加到您的FundedCount类(如果可能的话)
public FundedCount() {}
Run Code Online (Sandbox Code Playgroud)
并使用
.Select(x => new FundedCount{
<Property1> = x.Key.BuyerId,
<Property2> = x.Count() / 30 * daysInMonth
})
.ToList();
Run Code Online (Sandbox Code Playgroud)