Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为LinqToSql生成适当的SQL?_C#_Entity Framework_Linq To Sql - Fatal编程技术网

C# 如何为LinqToSql生成适当的SQL?

C# 如何为LinqToSql生成适当的SQL?,c#,entity-framework,linq-to-sql,C#,Entity Framework,Linq To Sql,根据当前用户权限,我使用LinqToSql按对象状态从数据库收集一些数据。我使用如下扩展: Context.Object1.ByActiveStatus(); Context.Object2.ByActiveStatus(); 我现在有以下实现,它工作得很好 public class Object1{ public string Status {get;set;} //generated by Visual Studio (simplified version) public

根据当前用户权限,我使用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)
}
公共类Object1{
公共字符串状态{get;set;}//由Visual Studio生成(简化版)
公共Guid?CreatedBy{get;set;}//由Visual Studio生成(简化版)
公共Guid?LastUpdatedBy{get;set;}//由Visual Studio生成(简化版)
}
公共类对象2{
公共字符串状态{get;set;}//由Visual Studio生成(简化版)
公共Guid?由Visual Studio生成的{get;set;}//修改(简化版)
}
//独立静态类中的扩展
公共静态IQueryable ByActiveStatus(此IQueryable代表)
{
return CurrentUser.IsAdmin
?代表
:rep.Where(ch=>ch.Status==“活动”
||ch.CreatedBy==CurrentUser.CurrentUserId
||ch.LastUpdatedBy==CurrentUser.CurrentUserId)
}
公共静态IQueryable ByActiveStatus(此IQueryable代表)
{
return CurrentUser.IsAdmin
?代表
:rep.Where(ch=>ch.Status==“活动”
||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)));
}
public类Object1:IActiveStatus{
公共字符串状态{get;set;}//由Visual Studio生成(简化版)
public int CreatedBy{get;set;}//由Visual Studio生成(简化版)
public int LastUpdatedBy{get;set;}//由Visual Studio生成(简化版)
}
公共部分类Object1:IActiveStatus{
公共IEnumerable GetModifiedBy(){
创造收益率;
上次更新的收益率;
}
}
公共类对象2:IActiveStatus{
公共字符串状态{get;set;}//由Visual Studio生成(简化版)
public int ModifiedBy{get;set;}//由Visual Studio生成(简化版)
}
公共部分类对象2:IActiveStatus{
公共IEnumerable GetModifiedBy(){
收益率修正;
}
}
公共接口IActiveStatus{
字符串状态{get;set;}
IEnumerable GetModifiedBy();
}
公共静态IQueryable ByActiveStatus(此IQueryable代表),其中T:IActiveStatus
{
return CurrentUser.IsAdmin
?代表
:rep.Where(ch=>ch.Status==“活动”
||任何(c=>c.Value.Equals(CurrentUser.CurrentUserId));
}
此解决方案不起作用,因为LinqToSql无法将GetModifiedBy()方法正确转换为SQL。 如何正确生成sql:

  • 需要实现什么(自定义提供程序还是什么?)
  • 如有可能,请提供样品

  • 哦,是的,谢谢,那是复制/粘贴问题。当然我有你指定的语法。固定在主题中。我还将int类型更改为Guid?(就像在我的代码中一样)和
    c=>c.Value==CurrentUser.CurrentUserId
    c=>c.Value.Equals(CurrentUser.CurrentUserId)
       public IEnumerable<string> GetModifiedBy(){
            yield return CreatedBy{get;set;}
            yield return LastUpdatedBy{get;set;}
        }
    
       public IEnumerable<int> GetModifiedBy(){
            yield return CreatedBy;
            yield return LastUpdatedBy;
        }