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:
Der angegebene Typmember "Age" wird in LINQ to Entities ..__ nicht unterstützt. Nur Initialisierer, Entitätsmitglieder und Entitätennavigationseigenschaften sind unterstützt.
Wenn Age nicht in der Datenbank enthalten ist, handelt es sich um eine Eigenschaft, die ich in der Klasse clsProfileDate zur Berechnung des Alters aus DOB erstellt habe. Gibt es eine Lösung dafür?
Sie können keine Eigenschaften verwenden, die keiner Datenbankspalte in einem Where
-Ausdruck zugeordnet sind. Sie müssen den Ausdruck basierend auf zugeordneten Eigenschaften erstellen, z.
var date = DateTime.Now.AddYears(-from);
result = result.Where(p => date >= p.DOB);
// you don't need `AsQueryable()` here because result is an `IQueryable` anyway
Als Ersatz für Ihre nicht zugeordnete Age
-Eigenschaft können Sie diesen Ausdruck wie folgt in eine statische Methode extrahieren:
public class clsProfileDate
{
// ...
public DateTime DOB { get; set; } // property mapped to DB table column
public static Expression<Func<clsProfileDate, bool>> IsOlderThan(int age)
{
var date = DateTime.Now.AddYears(-age);
return p => date >= p.DOB;
}
}
Und benutze es dann so:
result = result.Where(clsProfileDate.IsOlderThan(from));
Viele Leute werden sagen, dass dies eine schlechte Antwort ist, weil es nicht die beste Methode ist, aber Sie können es auch in eine Liste vor Ihrem Wo?.
result = result.ToList().Where(p => date >= p.DOB);
Slaumas Antwort ist besser, aber das würde auch funktionieren. Dies kostet mehr, weil ToList () die Abfrage für die Datenbank ausführt und die Ergebnisse in den Arbeitsspeicher verschieben.
Diese Fehlermeldung wird auch angezeigt, wenn Sie versehentlich vergessen, einen Setter für eine Eigenschaft zu definieren .. _. Beispiel:
public class Building
{
public string Description { get; }
}
var query =
from building in context.Buildings
select new
{
Desc = building.Description
};
int count = query.ToList();
Beim Aufruf von ToList wird dieselbe Fehlermeldung angezeigt. Dies ist ein sehr subtiler Fehler und sehr schwer zu erkennen.
Ich habe vergessen, die Spalte auszuwählen (oder die Eigenschaft einem Spaltenwert zuzuordnen):
IQueryable<SampleTable> queryable = from t in dbcontext.SampleTable
where ...
select new DataModel { Name = t.Name };
Beim Aufruf von queryable.OrderBy("Id")
wird eine Ausnahme ausgelöst, obwohl für DataModel
die Eigenschaft Id
definiert ist.
Die korrekte Abfrage lautet:
IQueryable<SampleTable> queryable = from t in dbcontext.SampleTable
where ...
select new DataModel { Name = t.Name, Id = t.Id };
In diesem Fall ist es eine der einfachsten und besten Methoden, zuerst in list
umzuwandeln und dann where
oder select
zu verwenden.
result = result.ToList().where(p => date >= p.DOB);