【问题标题】:How to generate proper SQL for LinqToSql?如何为 LinqToSql 生成正确的 SQL?
【发布时间】:2012-03-11 16:29:07
【问题描述】:

我使用 LinqToSql 根据当前用户权限按对象状态从数据库中收集一些数据。我使用这样的扩展:

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. 如果可能,取样

【问题讨论】:

    标签: c# entity-framework linq-to-sql


    【解决方案1】:
       public IEnumerable<string> GetModifiedBy(){
            yield return CreatedBy{get;set;}
            yield return LastUpdatedBy{get;set;}
        }
    

    这是一个非常奇怪的结构,几乎无法编译。

    1. 签名中有string,但产生ints
    2. 更正确的方法似乎是yield return CreatedBy.ToString();

    你试过了吗?

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

    【讨论】:

    • 哦,是的,谢谢,那是复制/粘贴问题。当然,我有你指定的语法...。固定在主题中。我也将 int 类型更改为 Guid? (就像在我的代码中一样)和c=&gt;c.Value ==CurrentUser.CurrentUserIdc=&gt;c.Value.Equals(CurrentUser.CurrentUserId)
    猜你喜欢
    • 2014-07-04
    • 2023-01-19
    • 2011-02-19
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2018-08-20
    相关资源
    最近更新 更多