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:
- 什麼來實現它所需的(自定義提供商還是什麼?)?
- 樣品如果可能
哦,是的,謝謝你,這是複製/粘貼問題。當然,我有你指定的語法......固定在主題中。我也改變int類型爲Guid? (就像它在我的代碼中)和'c => c.Value == CurrentUser.CurrentUserId'到'c => c.Value.Equals(CurrentUser.CurrentUserId)' – Cheburek 2012-03-11 21:32:36