2009-09-02 21 views
6

データベースモデルの上にモデルがあり、そのオブジェクトをリポジトリにマップします。sql用にlinqでfactoryクラスを使用する方法は?

しかし、私のGetUsersで直接「新規」を選択しても、下で実装するように「select factoryreult」にするかは明らかに違いがあります。実行時にCreateFromDbModelメソッドにsql(System.NotSupportedException)への変換がないというエラーが表示されます。

方法はありますか?どういうわけか私はそれを修正することはできますか?

ファクトリメソッドを使用したい理由は、私は他の場所でオブジェクトをインスタンス化し、一つの場所に「マッピングコード」を維持したいかもしれないということです...任意のコメント

おかげで、 アンダース

public IQueryable<User> GetUsers(bool includeTeams) 
    { 
     return from u in _db.sc_Players 
       where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam)) 
       select UserFactory2.CreateFromDbModel(u); 
    } 


    public static User CreateFromDbModel(sc_Player player) 
    { 
     return new User 
        { 
         Id = player.sc_PlayerID, 
         FirstName = player.FirstName.Trim(), 
         LastName = player.LastName.Trim(), 
         PresentationName = player.FirstName.Trim() + " " + player.LastName.Trim(), 
         LoginName = player.aspnet_User.LoweredUserName, 
         IsTeam = player.IsTeam, 
         Email = player.aspnet_User.aspnet_Membership.Email, 
         Password = player.aspnet_User.aspnet_Membership.Password 
        }; 
    } 

答えて

1

GetUsersメソッドでIQueryableを返すのは問題ですか?リストを返すようにしてください。これにより、メソッド内でLinqクエリが実行されます。

public List<User> GetUsers(bool includeTeams) 
{ 
    return (from u in _db.sc_Players 
    where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam)) 
    select UserFactory2.CreateFromDbModel(u)).ToList(); 
} 

これが問題を解決するかどうかはわかりません。 Linqpadで行っていることをローカルデータベース上で複製することができました。しかし、私のサンプルはIQueryableを返していませんでした。あなたはGetUsers()の外でIQueryableコレクションを改変していますか?

編集:

私はいくつかのより多くのチェックを行ってきました。私は)のIQueryableコレクションは(GetUsersを呼び出した後に、第2のLINQクエリで使用されたので、私は私のサンプルを変更した場合にのみ、エラーを再現することができました:

IQueryable<User> query = GetUsers(true); 

var q = from u in query 
    where u.Name.Contains("Bob") 
    select new {Name = u.FirstName + " " + u.LastName}; 

GetUsersで上に示唆したように、あなたがリストを返します場合、私は賭け()エラーは消えてしまいます。唯一の欠点は、GetListener()を呼び出すときにクエリーを実行済みであるため、GetUsers()を呼び出した後に行うフィルタリングによってデータベースから返されるデータ量が制限されないことです。

編集2:

残念ながら、私は、クエリであなたのファクトリメソッドを含めるための他の方法はないと思います。私はもう一つ考えている。 IQueryableの拡張メソッドを作成して、ToUserList()のように呼び出すことができます。 ToUserList()の内部では、クエリに対してToList()を呼び出し、ユーザーのコレクションを返すファクトリメソッドを呼び出します。 Linqを使用してデータのフィルタリングが終了したら、このメソッドを呼び出します。これにより、データベースからデータをロードする準備ができたときにのみクエリを実行できます。例を以下に示します。

public static List<Users> ToUserList(this IQueryable<User> query) 
{ 
    return query.ToList().Select(u => UserFactory2.CreateFromDbModel(u)); 
} 

コールこのような拡張メソッド:これは理にかなって

// Filter the data using linq. When you are ready to execute the query call: 
query.ToUserList(); // Query will execute and a list of User objects returned. 

希望。 ダグラスH.

+0

おかげダグラスとRossisdead、 私は私のファクトリメソッドを呼び出す前に、リストに変換する試みましたが、私はすべてのLINQを返す必要がないだけでなく、データベースからオブジェクトを取得するには、私はすべてのドメインモデルオブジェクトも構築しなければなりません。そして、私はそれを必要としない方法を見つけようとしていました...さらに、私はサービスレイヤーでフィルタリングを行い、リストをクエリ可能。 ... –

+0

こんにちはAnders、 上記の編集2を参照してください。 – Douglas

+0

こんにちはDouglas、 答えとして返信をマークしますが、データレイヤオブジェクトをサービスレイヤに公開するデータレイヤにデータベースのlinqオブジェクトを保持したいと考えていました。 –

1

エラーはかなりそれをすべて説明します。

"メソッドCreateFromDbModelにはsql(System。あなたのCreateFromDbModelメソッドはSQL関数ではありません。あなたのアプリケーションは、オブジェクトがサーバからあなたに返されるまで、CreateFromDbModel関数を実行することはできません。 ToListメソッド()、またはあなたのクエリに似たようなあなたがそれらにCreateFromDbModelを実行する前に。

関連する問題