2011-01-05 18 views
1

in einer Lösung, die ich habe eine Interface-Klasse bekommt IUser und in einem anderen Projekt, eine Klasse Umsetzung Benutzer Implementierung IUser.C# LINQ to Entities: nicht unterstützter Typ

Ausführen von LINQ-Abfragen auf IUser Objekte wirft mir die folgende Ausnahme:

Der angegebene Typ Mitglied 'Benutzername' ist nicht in LINQ to Entities unterstützt. Es werden nur Initialisierungs-, Entitäts- und Entitätsnavigationseigenschaften unterstützt.

Können Sie mir bitte helfen, dies zu lösen? Mit freundlichen Grüßen

Sample query(Users() returns IQueryable<IUser>: 
var c= (from user in bank.Users() 
          where user.Username == "anUser" 
          select user); 

hier unten einige Code:

//the interface 

public interface IUser 
{ 

    string Username { get; } 
} 

// the implementation 
public partial class User : IUser 
{ 

    public string Bankname 
    { 
     get 
     { 
      return bank_name; 
     } 
    } 

// the partial class generated from the entity model 
[EdmEntityTypeAttribute(NamespaceName="Database1Model", Name="User")] 
[Serializable()] 
[DataContractAttribute(IsReference=true)] 
public partial class User : EntityObject 
{ 
    #region Factory Method 

    /// <summary> 
    /// Create a new User object. 
    /// </summary> 
    /// <param name="user_name">Initial value of the user_name property.</param> 
    /// <param name="pass_hash">Initial value of the pass_hash property.</param> 
    /// <param name="is_admin">Initial value of the is_admin property.</param> 
    /// <param name="bank_name">Initial value of the bank_name property.</param> 
    /// <param name="is_enabled">Initial value of the is_enabled property.</param> 
    public static User CreateUser(global::System.String user_name, global::System.String pass_hash, global::System.Boolean is_admin, global::System.String bank_name, global::System.Boolean is_enabled) 
    { 
     User user = new User(); 
     user.user_name = user_name; 
     user.pass_hash = pass_hash; 
     user.is_admin = is_admin; 
     user.bank_name = bank_name; 
     user.is_enabled = is_enabled; 
     return user; 
    } 

    #endregion 
    #region Primitive Properties 

    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.String user_name 
    { 
     get 
     { 
      return _user_name; 
     } 
     set 
     { 
      if (_user_name != value) 
      { 
       Onuser_nameChanging(value); 
       ReportPropertyChanging("user_name"); 
       _user_name = StructuralObject.SetValidValue(value, false); 
       ReportPropertyChanged("user_name"); 
       Onuser_nameChanged(); 
      } 
     } 
    } 
    private global::System.String _user_name; 
    partial void Onuser_nameChanging(global::System.String value); 
    partial void Onuser_nameChanged(); 
. 
. 
. 
. 
}  

Antwort

2

Ihr Username-Eigenschaft nicht über eine Set-Accessor.

Wenn Ihre Unterkunft nicht über einen Set-Accessor nicht implementiert, kann das Entity Framework nicht den Wert der Eigenschaft in dieser Entität gesetzt :)

Sie benötigen einen Setter für Usernamen zu definieren, dies getan werden könnte, in deiner konkreten Klasse.

0

Ich habe dies mit. ToArray(). AsQueryable(); auf mein IQueryable Ergebnis ..., im Beispiel rechts in die Methode bank.Users(). sowieso

Danke für Ihre Hilfe

Mit freundlichen Grüßen

+0

Wenn Sie es auf ein Array geworfen ruft es alle Zeilen aus der gesamten Tabelle aus der Datenbank. Dann führen Sie eine Abfrage im Speicher-Array ohne Indizes aus. Linq to Objects kann ein beliebiges Feld verwenden. Daher kann es Ihren schreibgeschützten UserName-Accessor verwenden, um auf das zugrunde liegende Feld user_name zuzugreifen. Wenn Ihre Benutzertabelle groß wird, wird Ihre Anwendung dadurch zerstört. –

Verwandte Themen