LINQ to Entities ne reconnaît pas la méthode 'Double Parse (System.String)', et cette méthode ne peut pas être traduite dans une expression de magasin
Je reçois le message d'erreur lorsque j'essaie d'exécuter le rapport. Le problème est ici: model.Referring = Math.Round(_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question1) ? 0 : Double.Parse(m.Question1)).Average());
public class SummaryDetails
{
public int ChannelId { get; set; }
public int ChannelGroupId { get; set; }
public string Question1 { get; set; }
public string Question2 { get; set; }
public string Question3 { get; set; }
public string Question4 { get; set; }
public int OrganizationId { get; set; }
}
public ActionResult AreaManager(AreaManagerModel model)
{
model.ShowCustomerReport = false;
model.ShowSurveyReport = true;
LoadModelVariablesonPostBack(model, 8);
var _newSurveyResult = (
from ls in SessionHandler.CurrentContext.LennoxSurveyResponses
join ml in SessionHandler.CurrentContext.MailingListEntries on ls.SurveyCode equals ml.SurveyCode
join m in SessionHandler.CurrentContext.MailingLists on ml.MailingListId equals m.MailingListId
join ch in SessionHandler.CurrentContext.Channels on m.ChannelId equals ch.ChannelId
join cg in SessionHandler.CurrentContext.ChannelGroups on ch.ChannelGroupId equals cg.ChannelGroupId
join dcg in SessionHandler.CurrentContext.ChannelGroups on cg.ParentChannelGroupId equals dcg.ChannelGroupId
join ncg in SessionHandler.CurrentContext.ChannelGroups on dcg.ParentChannelGroupId equals ncg.ChannelGroupId
join pcg in SessionHandler.CurrentContext.ChannelGroups on ncg.ParentChannelGroupId equals pcg.ChannelGroupId
select new SummaryDetails {
OrganizationId = ch.OrganizationId,
Question1 = ls.Question1Answer,
Question2 = ls.Question2Answer,
Question3 = ls.Question3Answer,
Question4 = ls.Question4Answer,
ChannelId = ch.ChannelId,
ChannelGroupId = model.TMId != 0 ? cg.ChannelGroupId : model.DistrictId != 0 ? dcg.ChannelGroupId : model.AreaId != 0 ? ncg.ChannelGroupId : model.NationId != 0 ? pcg.ChannelGroupId : model.AreaId == 0 ? ncg.ChannelGroupId : model.DistrictId == 0 ? dcg.ChannelGroupId : cg.ChannelGroupId
}
);
var _newSentSurveys = (
from ml in SessionHandler.CurrentContext.MailingListEntries
join m in SessionHandler.CurrentContext.MailingLists on ml.MailingListId equals m.MailingListId
join ch in SessionHandler.CurrentContext.Channels on m.ChannelId equals ch.ChannelId
join cg in SessionHandler.CurrentContext.ChannelGroups on ch.ChannelGroupId equals cg.ChannelGroupId
join dcg in SessionHandler.CurrentContext.ChannelGroups on cg.ParentChannelGroupId equals dcg.ChannelGroupId
join ncg in SessionHandler.CurrentContext.ChannelGroups on dcg.ParentChannelGroupId equals ncg.ChannelGroupId
join pcg in SessionHandler.CurrentContext.ChannelGroups on ncg.ParentChannelGroupId equals pcg.ChannelGroupId
where (ml.EmailDate != null || ml.LetterDate != null || ml.EmailBounce == null)
select new SummaryDetails
{
OrganizationId = ch.OrganizationId,
ChannelId = ch.ChannelId,
ChannelGroupId = model.TMId != 0 ? cg.ChannelGroupId : model.DistrictId != 0 ? dcg.ChannelGroupId : model.AreaId != 0 ? ncg.ChannelGroupId : model.NationId != 0 ? pcg.ChannelGroupId : model.AreaId == 0 ? ncg.ChannelGroupId : model.DistrictId == 0 ? dcg.ChannelGroupId : cg.ChannelGroupId
}
);
if (model.ChannelId != 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelId == model.ChannelId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelId == model.ChannelId);
}
else if (model.TMId != 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelGroupId == model.TMId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelGroupId == model.TMId);
}
else if (model.DistrictId != 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelGroupId == model.DistrictId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelGroupId == model.DistrictId);
}
else if (model.AreaId != 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelGroupId == model.AreaId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelGroupId == model.AreaId);
}
else if (model.NationId != 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelGroupId == model.NationId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelGroupId == model.NationId);
}
else if (model.NationId == 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.OrganizationId == 8);
_newSentSurveys = _newSentSurveys.Where(p => p.OrganizationId == 8);
}
else if (model.AreaId == 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelGroupId == model.LoggedChannelGroupId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelGroupId == model.LoggedChannelGroupId);
}
else if (model.DistrictId == 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelGroupId == model.LoggedChannelGroupId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelGroupId == model.LoggedChannelGroupId);
}
else if (model.TMId == 0)
{
_newSurveyResult = _newSurveyResult.Where(p => p.ChannelGroupId == model.LoggedChannelGroupId);
_newSentSurveys = _newSentSurveys.Where(p => p.ChannelGroupId == model.LoggedChannelGroupId);
}
model.SentSurveys = _newSentSurveys.Count() > 0 ? _newSentSurveys.Count() : 0;
model.CompletedSurveys = _newSurveyResult.Count() > 0 ? _newSurveyResult.Count() : 0;
model.PercentageComplete = model.SentSurveys != 0 ? (Convert.ToDouble(model.CompletedSurveys) / Convert.ToDouble(model.SentSurveys)) : 0;
if (_newSurveyResult.Count() > 0)
{
model.Referring = Math.Round(_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question1) ? 0 : Double.Parse(m.Question1)).Average());
model.ServicePerformance = Math.Round(_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question2) ? 0 : Double.Parse(m.Question2)).Average());
model.InstallPerformance = Math.Round(_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question3) ? 0 : Double.Parse(m.Question3)).Average());
model.ReferringLennox = Math.Round(_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question4) ? 0 : Double.Parse(m.Question4)).Average());
double overAllScore = CalculateOverallScore(
_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question1) ? 0 : Double.Parse(m.Question1)).Sum(),
_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question2) ? 0 : Double.Parse(m.Question2)).Sum(),
_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question3) ? 0 : Double.Parse(m.Question3)).Sum(),
_newSurveyResult.Select(m => string.IsNullOrEmpty(m.Question4) ? 0 : Double.Parse(m.Question4)).Sum(),
_newSurveyResult.Count());
model.OverallScore = Math.Round(overAllScore);
}
}
source d'informationauteur bladerunner
Vous devez vous connecter pour publier un commentaire.
Le problème ici est que votre requête est en cours de traduction en SQL et exécutés sur la base de données, et Entity Framework ne sais pas comment traduire
Double.Parse
en valide le code SQL. Toutefois, vous pouvez définir une méthode personnalisée pour faire de l'analyse syntaxique, et dites-Entity Framework comment traduire cette méthode pour SQL. Voici comment ça se passe:Définir la traduction
Ouvrir votre *.fichier edmx dans un éditeur de texte, et de regarder pour la
<edmx:ConceptualModels>
tag. En vertu de ce que vous devriez voir un<Schema Namespace="YourModel" ...>
tag. À l'intérieur du Schéma de la balise, ajoutez la ligne suivante:Ce qui définit la Enity-code SQL personnalisé de votre ParseDouble fonction va être traduit en.
Créer une méthode pour traduire
Maintenant, nous devons définir une fonction de correspondance dans le code que vous pouvez mettre dans votre LINQ déclaration. Votre fichier EDMX est utilisé pour générer une classe partielle qui hérite de ObjectContext. Puisque c'est une classe partielle, vous pouvez ajouter vos propres méthodes sans toucher le code généré - assurez-vous que les noms de classe de match.
Maintenant, vous pouvez revenir à votre LINQ déclaration, et remplacez toutes les occurrences de
Double.Parse
avecYourObjectContext.ParseDouble
. Puisque c'est une méthode qui fait des appelsDouble.Parse
il va travailler sur LINQ to Objects appels, et depuis, elle est également définie dans le fichier EDMX, il peut être traduit en SQL par LINQ to entities.Mais attendez, vous n'êtes pas encore fait!
J'ai remarqué que votre LINQ déclaration comprend également un appel à
Math.Round
. Je ne sais pas du haut de ma tête si Entity Framework inclut une traduction pour cette méthode, mais si ce n'est pas le cas, vous obtiendrez la même erreur pour la méthode après avoir corrigé l'un pourDouble.Parse
. Heureusement, la solution pour ce cas est presque exactement le même, à l'exception de la fonction définie dans le fichier EDMX ressemblerait à quelque chose comme ceci:Vous pouvez utiliser cette liste de EDM Fonctions Canoniques pour voir ce qui est valable pour le mettre à l'intérieur de la
<DefiningExpression>
balises.