3

そこで、既存のデータベースからVSでDataContext(Linq-Sql)を作成しました。Usersというテーブルがあるので、Userオブジェクトがあります。UserID特に、とUsernameプロパティに焦点を当てたいと思います。

今、私はインターフェースを持っています:

interface IUser
{
     int Id { get; }
     string Username { get; }
}

部分Userクラスを作成して実装したいIUser。これは、多くの場所ですべてのユーザーをIUserとして扱い、正確なUserクラスを気にしないようにするためです。

public partial class User : IUser
{
    public int Id
    {
         get { return UserID; }
    }
}

Usernamegetプロパティは、エンティティオブジェクトがすでに実装していることがわかっているため、実装していません。

私のようなクエリがあると、その呼び出しがSQLステートメントに変換され、存在しない列(UserIDが存在する)dc.Users.SingleOrDefault(p => p.Id == 5);を見つけようとするため、エラーであることがわかります。Idだから私はこのマッピングの問題を理解しています。

クエリを実行するdc.Users.SingleOrDefault(p => p.Username == "admin")と、エラーもスローされますが、Username実際にはデータベース内の既存の列であるため、カスタム/追加のマッピングを行う必要はないという印象があります。私は何が欠けていますか?

誰かがLinqと戦う方法と部分クラスがカスタムインターフェイスを実装する方法についての良い情報源を教えてもらえますか?

更新の質問: 試してみる前に、カスタムインターフェイスを使用してdatacontext.designer.csファイルを「リギング」する(個別の部分クラスファイルではなくクラス自体に実装する)ことが機能するかどうかを誰かが知っていますか?これを行うことの結果はありますか?

4

1 に答える 1

5

Generics と LINQ を使用する前にこれに遭遇しましたが、それを解決する方法は変更p.Id == 5することp.Id.Equals(5)で、LINQ はクエリをマップできました。

自動生成されたコードのリギングに関して、私は自分のプロジェクトでこれを行いました.唯一の煩わしさは、DBML ファイルを再生成する場合にすべてのインターフェイスを再度入力する必要があることです. クラスにインターフェイスを動的に追加する方法を調べたところ、この SO 投稿が見つかりましたが、まだ試していません。

C# でインターフェイスを動的に実装する最も良い方法は何ですか?

いずれにせよ、この方法で実装コードの多くの重複を取り除くことができたので、再入力は今の私たちにとってはるかに良いトレードオフです。

残念ながら、私は LINQ や .NET について十分な経験がなく、機能しないのにEquals()機能する理由を説明==できません :)

于 2015-04-22T06:07:38.980 に答える