Как я могу сделать динамическое включение в EF? [Дубликат]

Вы правы - без проверки подлинности сертификата на клиенте и сервере есть открытие для человека в средней атаке.

SSL может быть «безопасным в обоих направлениях», если вы используете взаимная аутентификация также называется двухсторонним SSL .

19
задан Boy Pasmo 23 February 2014 в 15:59
поделиться

4 ответа

Причина, по которой первый сценарий не работает, заключается в том, что System.Linq.IQueryable является интерфейсом, который реализуется, среди прочих, классом System.Data.Entity.DbSet. В C #, если класс C реализует интерфейс I, когда дело доходит до переходов между типами, вы можете также рассматривать I как базовый класс C (даже семантика class C : I предлагает такой подход) , И поскольку вы не можете неявно (то есть не дословно) использовать класс (или интерфейс) для одного из его классов-потомков, вы получаете ошибку времени компиляции при попытке сделать это. Вы можете сделать обратное, то есть неявно применить класс потомков к его базовому классу (или интерфейсу). Это то, что происходит во втором сценарии.

В вашем случае вы можете обмануть компилятор, произнеся явно:

query = (DbSet<Customer>) query.Where(p => p.Id == id);

, но я бы настоятельно советовал вам не с тех пор, ll заканчивается беспорядочным исключением, потому что результат query.Where(p => p.Id == id) на самом деле не является экземпляром DbSet<Customer>, а скорее некоторым классом, представляющим результат запроса, выполненного на DbSet<Customer>, который реализует интерфейс IQueryable .

Итак, чтобы подвести итог, давайте рассмотрим все сценарии:

Сценарий 1:

//query is of type DbSet<Customer>
var query = _db.Products; 
if (bool) {
  //here you're trying to assign a value of type IQueryable<Customer>
  //to a variable of it's descendant type DbSet<Customer>
  //hence the compile-time error
  query = query.Where(p => p.Id == id); 
}

Сценарий 2:

//here you implicitly cast value of type DbSet<Customer>
//to IQueryable<Customer>, which is OK
IQueryable<Customer> query = _db.Products; 
if (bool) {
  //here you're assigning a value of type IQueryable<Customer>
  //to a variable of the same type, which is also OK
  query = query.Where(p => p.Id == id); 
}

Сценарий 3:

//I assume you have the following line in your code
var products = _db.Products;
//query is of type IQueryable<Customer>, because you perform
//a query on the DbSet<Product>
var query = from product in products
            select product;
if (bool) {
  //here you're assigning a value of type IQueryable<Customer>
  //to a variable of the same type, which is OK
  query = query.Where(p => p.Id == id); 
}
23
ответ дан Grx70 15 August 2018 в 19:56
поделиться
  • 1
    IQueryable & л; MediaRef & GT; medRef = context.MediaRefs; if (MediaId! = null) medRef = medRef.Where (w = & gt; w.MediaId == MediaId); .. но это не работает в моем сценарии .. (Сценарий 2) – Dragon 23 September 2015 в 11:51
  • 2
    @Sadaquat Что именно вы подразумеваете под «нерабочим»? Не компилируется ли код, и если да, то какое сообщение об ошибке? В противном случае возникает ли исключение, и если да, то какое сообщение об исключении? – Grx70 23 September 2015 в 11:58
  • 3
    его выдача ошибки времени компиляции, та же ошибка .. Невозможно неявно преобразовать тип 'System.Linq.IQueryable & lt; gt;' to 'System.Data.Entity.DbSet & lt; gt ;, хотя я выполнил свою работу, используя подход, основанный на сценарии 3, но мне любопытно узнать, почему сценарий 2 дает ошибку компиляции – Dragon 23 September 2015 в 12:35

Это потому, что _db.Products не является запросом, это DbSet.

Второй блок работает, потому что вы его передаете в IQueryable, а последний работает, потому что это фактический запрос.

0
ответ дан dursk 15 August 2018 в 19:56
поделиться
  • 1
    Поэтому, если я объявляю DbSet и присваиваю ему общий. DbSet получает бросок? – Boy Pasmo 23 February 2014 в 16:42
  • 2
    Существует очень мало причин использовать DbSet, особенно в этом контексте. Просто запросите базу данных. – dursk 23 February 2014 в 16:52
  • 3
    DbSet & л; TEntity & GT; реализует IQueryable & lt; TEntity & gt; поэтому это запрос. Проблема заключается не в «query.Where (...)», а в задании «query = query.Where (...)». Другими словами, проблема заключается не в DbSet, который не является Query, а в Query, который не является DbSet – Denis Itskovich 23 February 2014 в 17:00

При использовании var компилятор выводит тип выражения справа от присваивания. Когда вы пишете

var query = _db.Products;

query имеет тип DbSet<Product>, и ему не может быть назначено какое-либо IQueryable<Product>, которое возвращает метод расширения Where.

Когда вы использовали синтаксис запроса, query снова IQueryable<Product>, что заставило его работать. Это эквивалентно записи

var query = products.Select(t => t);

. Метод расширения Select, например Where, возвращает IQueryable<Product>.

5
ответ дан Eli Arbel 15 August 2018 в 19:56
поделиться
var query = _db.Products.Where(x => true);
if (bool) {
  query = query.Where(p => p.Id == id);
}
0
ответ дан user1855805 15 August 2018 в 19:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: