2012-03-11 99 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 2012-03-11 21:32:36

相關問題