var result =
(from bd in context.tblBasicDetails
from pd in context.tblPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
from opd in context.tblOtherPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
select new clsProfileDate()
{
DOB = pd.DOB
});
foreach (clsProfileDate prod in result)
{
prod.dtDOB = !string.IsNullOrEmpty(prod.DOB) ? Convert.ToDateTime(prod.DOB) : DateTime.Today;
int now = int.Parse(DateTime.Today.ToString("yyyyMMdd"));
int dob = int.Parse(prod.dtDOB.ToString("yyyyMMdd"));
string dif = (now - dob).ToString();
string age = "0";
if (dif.Length > 4)
age = dif.Substring(0, dif.Length - 4);
prod.Age = Convert.ToInt32(age);
}
GetFinalResult(result);
protected void GetFinalResult(IQueryable<clsProfileDate> result)
{
int from;
bool bfrom = Int32.TryParse(ddlAgeFrom.SelectedValue, out from);
int to;
bool bto = Int32.TryParse(ddlAgeTo.SelectedValue, out to);
result = result.AsQueryable().Where(p => p.Age >= from);
}
Hier bekomme ich eine Ausnahme:
Das angegebene Typmitglied "Alter" wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entitätsnavigationseigenschaften unterstützt.
Wenn sich das Alter nicht in der Datenbank befindet, ist es eine Eigenschaft, die ich in der Klasse clsProfileDate erstellt habe, um das Alter aus dem Geburtsdatum zu berechnen. Irgendeine Lösung dafür?
entity-framework-4
linq-to-entities
Sarang Amrutkar
quelle
quelle
from a in db.aitems select new Model { A = a.A }
Hier in dieser Abfrage können Sie genau alle Eigenschaften angeben, die Sie verwenden möchtenWhere
, damit Sie hier filtern oder gruppieren oder nur nach A sortieren können, da Sie nur eine Zuordnung für A -A = a.A
Viele Leute werden sagen, dass dies eine schlechte Antwort ist, da dies keine bewährte Methode ist. Sie können sie jedoch auch in eine Liste vor Ihrem Aufenthaltsort konvertieren.
Slaumas Antwort ist besser, aber das würde auch funktionieren. Dies kostet mehr, da ToList () die Abfrage für die Datenbank ausführt und die Ergebnisse in den Speicher verschiebt.
quelle
ToList
Aufruf wird die Abfrage ausgeführt und unnötige Daten werden in den Speicher geladen. Es ist also besser, einige Grenzen bei der Codierung zu haben!Diese Fehlermeldung wird auch angezeigt, wenn Sie versehentlich vergessen haben, einen Setter für eine Eigenschaft zu definieren. Zum Beispiel:
Der Aufruf von ToList gibt dieselbe Fehlermeldung aus. Dieser ist ein sehr subtiler Fehler und sehr schwer zu erkennen.
quelle
Ich habe vergessen, die Spalte auszuwählen (oder die Eigenschaft einem Spaltenwert zuzuordnen):
Beim Aufruf
queryable.OrderBy("Id")
wird eine Ausnahme ausgelöst, obwohlDataModel
die EigenschaftId
definiert ist.Die richtige Abfrage lautet:
quelle
In meinem Fall wurde diese Fehlermeldung nur in der Produktion angezeigt, jedoch nicht, wenn sie lokal ausgeführt wurde, obwohl die Binärdateien meiner Anwendung identisch waren.
In meiner Anwendung verwende ich eine benutzerdefinierte Funktion,
DbModelStore
damit das zur Laufzeit generierte EDMX auf der Festplatte gespeichert und beim Start von der Festplatte geladen wird (anstatt es von Grund auf neu zu generieren), um die Startzeit der Anwendung zu verkürzen - und aufgrund eines Fehlers in meinem Code I. Die EDMX-Datei auf der Festplatte wurde nicht ungültig. Daher verwendete Production eine ältere Version der EDMX-Datei von der Festplatte, die auf eine ältere Version der Typen meiner Anwendung verwies, bevor ich den Typnamen in der Ausnahmefehlermeldung umbenannte.Durch Löschen der Cache-Datei und Neustarten der Anwendung wurde das Problem behoben.
quelle
In diesem Fall besteht einer der einfachsten und besten Ansätze darin, es zuerst zu besetzen
list
und dannwhere
oder zu verwendenselect
.quelle
Das Überprüfen von Count () vor der WHERE-Klausel hat mein Problem gelöst. Es ist billiger als ToList ()
quelle