2011-07-30 7 views
1

は、私はORMとして流暢NHibernateはを使用して、mはSQLLINQのISNULL機能

Declare @Id Int 
set @UserName = Null 
set @FullName = Null 
Select * from tblPermission where (UserName= @UserName OR @UserName IS NULL) && (
FullName = @FullName OR @FullName IS NULL) 

でクエリを持っています。

私はこれをしようとは:m

var Allusers = from u in session.Query<User>() 
           where u.UserName.Contains(UserName) || UserName == null 
           && u.FullName.Contains(FullName) || FullName == null 
           select u; 

ユーザー名とフルネームの両方がいくつかの値を持つフィルタと、このLINQクエリは、ユーザ名の罰金が、動作していない動作します。 LINQでこの機能を実現する方法は?何か案が?

おかげ

答えて

2

私は動的にクエリを構築して行くだろう:それは、クエリなので、あなたがそれを列挙するまで

var Allusers = session.Query<User>(); 
if (UserName != null) 
    Allusers = Allusers.Where(u => u.UserName.Contains(UserName)); 
if (FullName != null) 
    Allusers = Allusers.Where(u => u.FullName.Contains(FullName)); 

、それはそうWhere呼び出しを連鎖することは実行されません実行されませんそれは複数回です。さらに、それぞれのケースで最適化されたSQLクエリを取得できます。

2

EDIT:私たちはより多くの詳細を持っていることになりましたまったく新しい答え...

私は、これはただの優先順位の問題であると思います。明示的にそれを表現:

Allusers = from u in session.Query<User>() 
      where (u.UserName.Contains(UserName) || UserName == null) 
       && (u.FullName.Contains(FullName) || FullName == null) 
      select u; 
+0

私は自分の質問を更新しました。 – Saad

+0

@Saad:更新された回答を参照してください。あなたがその情報を最初から提供していれば本当に役に立ちました。質問をよくするための提案については、http://tinyurl.com/so-hintsをお読みください。 –

関連する問題