Как создать правильный SQL для LinqToSql? - PullRequest
0 голосов
/ 11 марта 2012

Я использую 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. образец, если это возможно

1 Ответ

0 голосов
/ 12 марта 2012
   public IEnumerable<string> GetModifiedBy(){
        yield return CreatedBy{get;set;}
        yield return LastUpdatedBy{get;set;}
    }

это ОЧЕНЬ странная конструкция, которая вряд ли компилируется.

  1. Он имеет string в подписи, но дает int s
  2. Кажется, более правильный путь yield return CreatedBy.ToString();

Пробовали?

   public IEnumerable<int> GetModifiedBy(){
        yield return CreatedBy;
        yield return LastUpdatedBy;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...