2012-03-11 6 views
0

LinqToSqlを使用して、現在のユーザ権限に応じてオブジェクトステータスによってデータベースからデータを収集します。私はこのような拡張機能を使用しています:LinqToSql用の適切なSQLを生成するには?

Context.Object1.ByActiveStatus(); 
Context.Object2.ByActiveStatus(); 

私は今のところ次の実装を持っています。

public class Object1{ 
    public string Status {get;set;} //generated by Visual Studio (simplified version) 
    public Guid? CreatedBy {get;set;} //generated by Visual Studio (simplified version) 
    public Guid? LastUpdatedBy {get;set;} //generated by Visual Studio (simplified version) 
} 
public class Object2{ 
    public string Status {get;set;} //generated by Visual Studio (simplified version) 
    public Guid? ModifiedBy {get;set;} //generated by Visual Studio (simplified version) 
} 

//extensions in separate static class 
public static IQueryable<Object1> ByActiveStatus(this IQueryable<Object1> rep) 
{ 
    return CurrentUser.IsAdmin 
     ? rep 
     : rep.Where(ch=>ch.Status == "Active" 
      || ch.CreatedBy == CurrentUser.CurrentUserId 
      || ch.LastUpdatedBy == CurrentUser.CurrentUserId)   
} 

public static IQueryable<Object2> ByActiveStatus(this IQueryable<Object2> rep) 
{ 
    return CurrentUser.IsAdmin 
     ? rep 
     : rep.Where(ch=>ch.Status == "Active" 
      || ch.ModifiedBy == CurrentUser.CurrentUserId) 
} 

このように変換します。

public class Object1:IActiveStatus{ 
    public string Status {get;set;} //generated by Visual Studio (simplified version) 
    public int CreatedBy {get;set;} //generated by Visual Studio (simplified version) 
    public int LastUpdatedBy {get;set;} //generated by Visual Studio (simplified version) 
} 
public partial class Object1:IActiveStatus{ 
    public IEnumerable<Guid?> GetModifiedBy(){ 
     yield return CreatedBy; 
     yield return LastUpdatedBy; 
    } 
} 
public class Object2:IActiveStatus{ 
    public string Status {get;set;} //generated by Visual Studio (simplified version) 
    public int ModifiedBy {get;set;} //generated by Visual Studio (simplified version) 
} 
public partial class Object2:IActiveStatus{ 
    public IEnumerable<Guid?> GetModifiedBy(){ 
     yield return ModifiedBy; 
    } 
} 

public interface IActiveStatus{ 
    string Status{get;set;} 
    IEnumerable<Guid?> GetModifiedBy(); 
} 

public static IQueryable<T> ByActiveStatus<T>(this IQueryable<T> rep) where T:IActiveStatus 
{ 
    return CurrentUser.IsAdmin 
     ? rep 
     : rep.Where(ch=>ch.Status == "Active" 
      || ch.GetModifiedBy().Any(c=>c.Value.Equals(CurrentUser.CurrentUserId))); 
} 

このソリューションは、LinqToSqlがGetModifiedBy()メソッドをSQLに正しく変換できないため機能しません。 SQLを正しく生成するにはどうすればいいですか?

  1. 実装するには何が必要ですか(カスタムプロバイダか何か)?これはほとんどコンパイルしていない非常に奇妙な構造です
  2. 可能

答えて

0
public IEnumerable<string> GetModifiedBy(){ 
     yield return CreatedBy{get;set;} 
     yield return LastUpdatedBy{get;set;} 
    } 

場合

  • サンプル。

    1. それは署名でstringを持っていますが、利回りint
    2. もっと正しい方法はyield return CreatedBy.ToString();

    のようですあなたがしようとしましたか?

    public IEnumerable<int> GetModifiedBy(){ 
         yield return CreatedBy; 
         yield return LastUpdatedBy; 
        } 
    
  • +0

    ありがとう、それはコピー/貼り付けの問題でした。もちろん、あなたが指定した構文があります...。トピックに固定されています。 int型をGuidに変更しましたか? (それは私のコードのように) 'c => c.Value == CurrentUser.CurrentUserId'から' c => c.Value.Equals(CurrentUser.CurrentUserId) ' – Cheburek

    関連する問題