asp.net/entityframework-为什么我的应用程序池会崩溃?

uoifb46i  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(257)

我正在尝试向我的api添加一个新方法。
该方法的目标是返回 Partenaires 具有给定的 Prestation 在他们的施舍中。
当我通过get请求调用该方法时,api的应用程序池崩溃。在事件日志中,我有一个名为microsoft windows was的警告,链接的错误是:
为应用程序池“uphairapi2”提供服务的进程遇到与windows进程激活服务的致命通信错误。进程id为“3960”。数据字段包含错误号。
networkdeveloper工具说它无法加载响应数据。
未能加载响应数据
当我回来的时候 return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value)).ToString(); ,返回的请求如下:
“”选择\r\n“ Extent1 . IdPartenaire ,\r\n Extent1 . FirstName ,\r\n Extent1 . LastName ,\r\n Extent1 . Email ,\r\n Extent1 . Password ,\r\n Extent1 . PasswordSalt ,\r\n Extent1 . Type ,\r\n Extent1 . Pays ,\r\n Extent1 . Ville ,\r\n Extent1 . CodePostale ,\r\n Extent1 . Adresse ,\r\n Extent1 . Lat ,\r\n Extent1 . Lng ,\r\n Extent1 . ImageUrl ,\r\n Extent1 . CouvertureUrl ,\r\n Extent1 . DateNaissance ,\r\n Extent1 . ADomicile ,\r\n Extent1 . SeDeplace ,\r\n Extent1 . DateAjout ,\r\n Extent1 . AdresseComplement ,\r\n Extent1 . TelMobile ,\r\n Extent1 . ValidationAutomatique ,\r\n Extent1 . NotifEmailMessage ,\r\n Extent1 . NotifEmailReservation ,\r\n Extent1 . NotifEmailPaiement ,\r\n Extent1 . NotifEmailNewsletter ,\r\n Extent1 . NotifSmsMessage ,\r\n Extent1 . NotifSmsReservation ,\r\n Extent1 . IdUserMango ,\r\n Extent1 . Iban ,\r\n Extent1 . TitulaireCompte ,\r\n Extent1 . IdWallet ,\r\n Extent1 . IdAccount ,\r\n Extent1 . Valide ,\r\n Extent1 . Son ,\r\n Extent1 . Push ,\r\n Extent1 . IdPhone \r\n从 Partenaire 作为 Extent1 \r\n存在的位置(选择\r\n1作为 C1 \r\n从 PartenairePrestation 作为 Extent2 内部连接 Prestation 作为 Extent3Extent2 . IdPrestation = Extent3 . IdPrestation \r\n哪里( Extent1 . IdPartenaire = Extent2 . IdPartenaire )以及(( Extent3 . NomPrestation =@p\u linq\u 0)或(( Extent3 . NomPrestation 是null)和(@p\u linq\u 0是null))”
mysql workbench的等价物是:
选择extent1.idpartneire、extent1.firstname、extent1.lastname、extent1.email、extent1.password、extent1.passwordsalt、extent1.type、extent1.pays、extent1.ville、extent1.codepastale、extent1.adresse、extent1.lat、extent1.lng、extent1.imageurl、extent1.couvertureurl、extent1.datenaissance、extent1.adomicile、extent1.sedeplace、extent1.dateajout,extent1.adressecomplete、extent1.telmobile、extent1.validationautomatique、extent1.notifemailmessage、extent1.notifemailreservation、extent1.notifemailpaiement、extent1.notifemailnewsletter、extent1.notifsmmessage、extent1.notifsmsrervation、extent1.idusermango、extent1.iban、extent1.titulairempte、extent1.idwallet、extent1.idaccount,extent1.valide、extent1.son、extent1.push、extent1.idphone from partenaire as extent1 where exists(从partenairereprestation as extent2中选择1 as c1 inner join prestation as extent3 on extent2.idprestation=extent3.idprestation where(extent1.idpartenaire=extent2.idpartenaire)和((extent3.nomprestation='barbe'))
我在mysqlworkbench中测试了这个请求,返回了一组数据。
我的方法是:

// GET: api/Partenaires_prestations
        [Authorize]
        [Route("api/Partenaires_prestations")]
        public List<PartenaireMapItem> GetPartenairesWithPrestations() {

            Random rnd = new Random();

            var queryString = Request.GetQueryNameValuePairs();

            var prestation = queryString.FirstOrDefault();

            return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
                .ToList()
                .Select(p => new PartenaireMapItem {
                    IdPartenaire = p.IdPartenaire,
                    FirstName = p.FirstName,
                    LastName = p.LastName,
                    NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
                    Type = p.Type,
                    DureeMin = 50,
                    Lat = p.Lat,
                    Lng = p.Lng,
                    ImageUrl = p.ImageUrl,
                    SeDeplace = p.SeDeplace,
                    ADomicile = p.ADomicile,

                    Notes = p.NoteClientPartenaires,
                    Prestations = p.PartenairePrestations.Select(y => y.Prestation.NomPrestation).ToList();
                }).ToList();
}

我做错什么了?
任何帮助将不胜感激,因为我找不到另一个相关的线程在互联网上。

rkttyhzu

rkttyhzu1#

您可能需要调试api并指定更多细节来帮助缩小原因。我可以看到以下几点:

var prestation = queryString.FirstOrDefault();
// Handle when prestation comes back #null. Is that valid?

var results = db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
//                .ToList() // Avoid .ToList() here... Select the entity properties you need.
    .Select(p => new PartenaireMapItem {
        IdPartenaire = p.IdPartenaire,
        FirstName = p.FirstName,
        LastName = p.LastName,
        // NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName, // Remove. Make this a computed property in your view model.
        Type = p.Type,
        // DureeMin = 50, // Can remove, can be a computed property.
        Lat = p.Lat,
        Lng = p.Lng,
        ImageUrl = p.ImageUrl,
        SeDeplace = p.SeDeplace, // Ok if a String/value. 
        ADomicile = p.ADomicile, // Ok if a String/value.

        Notes = p.NoteClientPartenaires, // Ok if a String/value.
        Prestations = p.PartenairePrestations.Select(y => y.Prestation.NomPrestation).ToList(); // Assuming this is retrieving the names of presentations. List<string>.
    }).ToList();

return results;

之所以需要early.tolist(),是因为您正在尝试计算linq表达式中的值(nameComplett),通常这些值会被提供给ef,而您的db提供程序无法理解这些值。为了提高效率,只选择“Map属性”,而将视图模型上的所有计算值更改为只读属性(partenairemapitem公司)

private string _nomComplet = null;
public string NomComplet
{ 
    get { return _nomComplet ?? (_nomComplet = LastName.Substring(0,1).ToUpper() + ". " + FirstName); }
}

该示例缓冲结果,假设名称详细信息是只读的。如果名字/姓氏可以更新,每次只需返回计算出的名字。
假设sedelace/adomicile是字符串值而不是子实体,则其他属性应该很好。同样的情况也发生在施舍清单上。一个字符串列表的presstation名称应该是罚款。
我做的另一个小改动是在返回之前检索要检查的变量中的视图模型。这更便于在返回之前使用断点检查结果。从这里确定是否有任何错误是从结果的计算中返回的,或者其他一些事情,比如将结果视图模型序列化回客户机。

相关问题