2012-03-11 96 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

相关问题