Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework “有哪些可能的解决办法?”;Linq to Entites中只支持无参数构造函数“;_Entity Framework_Linq To Entities - Fatal编程技术网

Entity framework “有哪些可能的解决办法?”;Linq to Entites中只支持无参数构造函数“;

Entity framework “有哪些可能的解决办法?”;Linq to Entites中只支持无参数构造函数“;,entity-framework,linq-to-entities,Entity Framework,Linq To Entities,在我的查询中,我需要返回没有默认构造函数的类的实例(特别是在自定义成员资格提供程序中,MembershipUser是罪魁祸首) 语法正确,但会导致运行时错误,因为LINQ to实体中只支持无参数构造函数和初始值设定项 更新:作为一种解决方法,我现在将选择引入一个列表(它解析查询表达式的运行),然后我可以从该列表中选择新的MembershipUser var users = (from l in context.Logins select new { login = l }).ToList

在我的查询中,我需要返回没有默认构造函数的类的实例(特别是在自定义成员资格提供程序中,MembershipUser是罪魁祸首)

语法正确,但会导致运行时错误,因为LINQ to实体中只支持无参数构造函数和初始值设定项

更新:作为一种解决方法,我现在将选择引入一个列表(它解析查询表达式的运行),然后我可以从该列表中选择新的MembershipUser

var users = (from l in context.Logins
    select new { login = l }).ToList().Select(u => new MembershipUser (
Name,
u.login.Username, // username
u.login.Id, // provider key
u.email.MailTo,
u.login.PasswordQuestion,
u.login.Notes.FirstOrDefault().NoteText,
u.login.IsApproved,
u.login.IsLockedOut,
u.login.CreatedOn,
u.login.LastLoginOn.HasValue ? u.login.LastLoginOn.Value : DateTime.MinValue,
u.login.LastActivityOn.HasValue ? u.login.LastActivityOn.Value : DateTime.MinValue,
DateTime.MinValue,
u.login.LastLockedOutOn.HasValue ? u.login.LastLockedOutOn.Value : DateTime.MinValue
    );

我认为问题在于,您需要从LINQ转义到实体,然后转到LINQ到对象,这允许任意方法调用。
AsEnumerable
扩展方法可以为您实现这一点。 这个怎么样:

var users = from l in context.Logins.AsEnumerable() 
    select new MembershipUser( 
        Name, 
        l.Username, // username 
        l.Id, // provider key 
        l.MailTo, 
        l.PasswordQuestion, 
        l.Notes.FirstOrDefault().NoteText, 
        l.IsApproved, 
        l.IsLockedOut, 
        l.CreatedOn, 
        l.LastLoginOn ?? DateTime.MinValue, 
        l.LastActivityOn ?? DateTime.MinValue, 
        DateTime.MinValue, 
        l.LastLockedOutOn ?? DateTime.MinValue 
    ); 

否,因为“LINQ to Entities无法识别该方法,并且该方法无法转换为存储表达式”现在完全有意义了。谢谢。这是否意味着任何
where
部分都不会转换为SQLWHERE子句?它会不会把所有的登录都拉下来,然后LINQ->Objects接管
where
过滤?SeanHanley:你把所有的过滤/分组/加入/排序逻辑放在
可计算的
之前。查询中的最后两个步骤是
.AsEnumerable()。选择(r=>new…
。通过
ToList()
列表具体化不需要浪费时间和内存。只需像Gabe回答的那样,使用
AsEnumerable()
解析断开连接的
IEnumerable
var users = from l in context.Logins.AsEnumerable() 
    select new MembershipUser( 
        Name, 
        l.Username, // username 
        l.Id, // provider key 
        l.MailTo, 
        l.PasswordQuestion, 
        l.Notes.FirstOrDefault().NoteText, 
        l.IsApproved, 
        l.IsLockedOut, 
        l.CreatedOn, 
        l.LastLoginOn ?? DateTime.MinValue, 
        l.LastActivityOn ?? DateTime.MinValue, 
        DateTime.MinValue, 
        l.LastLockedOutOn ?? DateTime.MinValue 
    );