Универсальный метод и linq

#c# #entity-framework #generics #join #where-clause

#c# #entity-framework #универсальные методы #Присоединиться #где-предложение

Вопрос:

У меня есть 2 таблицы в моем проекте:

 TableEnvelope{
 ID int primary key,
 EnvelopeNumber int,
 .
 .
 .    
}

TableCheck{
ID int primary key,
CMC7 varchar
.
.
.
}
  

Я должен «заблокировать» каждый документ для определенного пользователя, потому что 2 пользователя не могут видеть одну и ту же информацию.
Итак, у меня есть моя таблица:

 TableLock{
ID int primary key,
IDEnvelope int,
IDCheck int
UserId int
.
.
.
}
  

Я пытаюсь создать универсальный метод, чтобы взять N строк в моей таблице и заблокировать его, но я не могу.

 public IQueryable<TEntity> LockDocument<TEntity>(IQueryable<TEntity> colEntity, int countRows)
{
  TEntity objEntity = default(TEntity);
  Database db = new Database();


  var vQuery = (from entity in db.CreateObjectSet<TEntity>()
               Join tableLock in db.TableLock
                 // I have problems here.
                  on entity.ID equals tableLock.IDEntity
               where entity.ID not in tableLock.IDEntity).select().Take(countRows)
 }
  

Как я могу это сделать?
Заранее благодарю вас.

Комментарии:

1. Значит, пользователи владеют связью между конвертами и проверками, а не самими чеками или конвертами?

2. @Jodrell Связь существует между конвертами и чеками, но пользователь может получить либо конверт, либо чек, поэтому я должен добавить в TableLock идентификатор документа, который он использует.

Ответ №1:

Вы должны ограничить свой TEntity для предоставления дополнительной информации вашему методу. Например, вы можете определить интерфейс:

 public interface IEntity
{
    int ID { get; }
}
  

И реализуйте этот интерфейс всеми объектами, которые вы хотите передать своему методу. Теперь вы можете изменить определение вашего метода на:

 public IQueryable<TEntity> LockDocument<TEntity>(IQueryable<TEntity> colEntity, 
                                                 int countRows)
    where TEntity : IEntity
{ ... }
  

Это сообщит вашему методу, что он принимает только реализующие типы IEntity , и вы можете использовать любое свойство или метод, определенные IEntity в вашем методе, к которому у вас будет доступ entity.ID .