webentwicklung-frage-antwort-db.com.de

Der angegebene Typmember wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entitätennavigationseigenschaften unterstützt

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?

54
Sarang Amrutkar

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));
75
Slauma

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. 

16
Tony

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. 

9
Marcel Gelijk

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 };
1
Hp93

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);
0
Arash MAS