Как избежать «источника! = NULL» при использовании кодовых контрактов и LINQ для SQL? -- linq-to-sql поле с участием code-contracts пол Связанный проблема

How to avoid “source !=null” when using Code Contracts and Linq To Sql?


6
vote

проблема

русский

У меня есть следующий код, используя обычный контекст данных, который отлично работает:

 <код> var dc = new myDataContext(); Contract.Assume(dc.Cars!= null); var cars = (from c in dc.Cars             where c.Owner == 'Jim'             select c).ToList();   

Однако, когда я преобразую фильтр в метод расширения, как это:

 <код> var dc = new myDataContext(); Contract.Assume(dc.Cars!= null); var cars = dc.Cars.WithOwner('Jim');  public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner) {     Contract.Requires(cars != null);     return cars.Where(c => c.Owner == owner); }   

Я получаю следующее предупреждение:

Предупреждение: CodeContracts: Требуется недоказанный: источник! = NULL

Английский оригинал

I have the following code using a normal data context which works great:

var dc = new myDataContext(); Contract.Assume(dc.Cars!= null); var cars = (from c in dc.Cars             where c.Owner == 'Jim'             select c).ToList(); 

However when I convert the filter to an extension method like this:

var dc = new myDataContext(); Contract.Assume(dc.Cars!= null); var cars = dc.Cars.WithOwner('Jim');  public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner) {     Contract.Requires(cars != null);     return cars.Where(c => c.Owner == owner); } 

I get the following warning:

warning : CodeContracts: requires unproven: source != null

</div
     

Список ответов

1
 
vote
<Р> Я думаю, что ваше предупреждение вызвано параметром владельца, а не автомобили. Добавить предусловие в методе WithOwner, чтобы проверить, если владелец не является нулевым.
 <код> public static IQueryable<Car> WithOwner(IQueryable<Car> cars, string owner) {     Contract.Requires(cars != null);     Contract.Requires(!string.isNullOrEmpty(owner));     return cars.Where(c => c.Owner = owner); }   
<Р> В своем первом примере кода, у вас есть «Jim» жестко закодированы, поэтому никаких проблем там, потому что это не то, что может быть пустым. <Р> В вашем втором примере вы создали метод, для которого статический компилятор не может доказать, что источник (будучи владельцем) «никогда не будет нулевым», как другой код может назвать это с недопустимыми значениями.
 

My guess is that your warning is caused by the owner parameter, rather than the cars. Add a precondition in the WithOwner method to check if owner is not null.

public static IQueryable<Car> WithOwner(IQueryable<Car> cars, string owner) {     Contract.Requires(cars != null);     Contract.Requires(!string.isNullOrEmpty(owner));     return cars.Where(c => c.Owner = owner); } 

In your first code sample, you have 'Jim' hard-coded, so no problems there because there is not something which can be null.

In your second example you created a method for which the static compiler cannot prove that the source ( being owner ) 'will never be null', as other code might call it with an invalid values.

</div
 
 
   
   
0
 
vote
<Р> Интересно, как вы получите код, скомпилированный с помощью метода Extension, так как вам не хватает <сильный> <код> this ключевое слово в вашей подписи метода.
 <код> public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner) {     ... }   
<Р> / KP
 

I wonder how you get the code compiled with the Extension method since you are missing this keyword in your method signature.

public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner) {     ... } 

/KP

</div
 
 
0
 
vote
<Р> Его возможно, что ваш фрагмент кода не полностью описать код, который вы используете. <Р> Рассмотрим этот фрагмент вместо:
 <код> var dc = new myDataContext(); Contract.Assume(dc.Cars!= null); var models = dc.Cars.WithOwner('Jim').Select(c => c.Model);  public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner) {     Contract.Requires(cars != null);     return cars.Where(c => c.Owner == owner); }   
<Р> В этом отрезала его вероятное время выполнения будет жаловаться с предупреждением вы упомянули, но он не жалуется <код> Cars , возможно, является нулевой, то он жалуется на результат от <код> WithOwner (принят в <код> Select ), возможно, будучи нулем. <Р> Вы можете удовлетворить выполнения, гарантируя, что результат от вашего метода расширения не будет нулевым:
 <код> Contract.Ensures(Contract.Result<IQueryable<Car>>() != null);   
<Р> Этот контракт должен быть в порядке, потому что <код> Where не возвращает NULL, но вместо этого возвращает <код> public static IQueryable<Car> WithOwner(IQueryable<Car> cars, string owner) { Contract.Requires(cars != null); Contract.Requires(!string.isNullOrEmpty(owner)); return cars.Where(c => c.Owner = owner); } 0 , когда нет ни одного совпадения.
 

Its possible that your code snippet does not completely describe the code you are using.

Consider this snippet instead:

var dc = new myDataContext(); Contract.Assume(dc.Cars!= null); var models = dc.Cars.WithOwner('Jim').Select(c => c.Model);  public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner) {     Contract.Requires(cars != null);     return cars.Where(c => c.Owner == owner); } 

In this snipped its likely the runtime will complain with the warning you mentioned, but it is not complaining about Cars possibly being null, it is complaining about the result from WithOwner (passed into Select) possibly being null.

You can satisfy the runtime by ensuring that the result from your extension method will not be null:

Contract.Ensures(Contract.Result<IQueryable<Car>>() != null); 

This contract should be ok because Where will not return null, but instead returns an Enumerable.Empty<T>() when there are no matches.

</div
 
 
0
 
vote
<Р> Мы исправили это несколько релизов назад. Предупреждение было связано с некоторыми отсутствующими контрактов вокруг выражения строительства Linq и т.д. Linq методы выражения имеют контракты и C # компилятор генерирует код, который вызывает эти методы. Если у нас нет достаточного количества почтовых условий на названных методов, то вы можете получить эти загадочные предупреждения о коде, который вы даже не знаете, есть (если смотреть с ILDASM).
 

We fixed this a few releases back. The warning was due to some missing contracts around Linq expression construction etc. Linq expression methods have contracts and the C# compiler generates code that calls these methods. If we don't have enough post conditions on the called methods, then you can get these cryptic warnings about code that you don't even know is there (unless you look with ILdasm).

</div
 
 

Связанный проблема

2  C #, Linq2SQL - трюки для получения объекта ViewModel с данными соотношения?  ( C linq2sql tricks to fetch a viewmodel object with relation data ) 
Я не знаю linq2sql так хорошо, и мне было интересно, есть ли трюк для этого, вероятно, общий сценарий MVVM. У меня есть контекст данных Linq2SQL, содержащий м...

13  Преобразование SQL Rank () на LINQ или Альтернатива  ( Converting sql rank to linq or alternative ) 
У меня есть следующее заявление SQL, которое работает по желанию / ожидаемому. Однако я хотел бы перевести его в оператор LINQ (лямбда ??), так что он будет с...

1  Получение последних строк в результате выписки LINQ в SQL  ( Getting last rows from the result of linq to sql statement ) 
Я не мог получить последние статьи всех писателей в этом заявлении. <код> List<Editor> lstEditors = dataContext.GetTable<Editor>().Where(t => t.M_Active).Se...

3  Linq to sql: iqueryable - String содержит - Метод не поддерживается перевод для SQL  ( Linq to sql iqueryable string contains method has no supported translation ) 
Уважаемые эксперты linq или linq2sql, можете ли вы помочь мне решить этот случай? У меня есть класс книги, каждая книга имеет список и то, что я хочу, чтобы...

1  Linq к объекту SQL отмечает его, чтобы вставить автоматически  ( Linq to sql object is marking it to insert automatically ) 
Я делаю клону некоторых объектов, чтобы связать их с помощью сетки и избегать отслеживания объектов для изменений, что-то вроде: <код> var cloneEntities = D...

8  Linq options.loadwith Проблема  ( Linq options loadwith problem ) 
Я пишу систему ASP.NET на основе тегов. Используя следующую схему БД: <Код> Topic <many-many> TagTopicMap <many-many> Tag в основном это 3НФ подход (токс...

1  Союз на двух больших запросов LINQ не поддерживается. Как мне обойти его (если вообще возможно)  ( Union on two big linq queries not supported how do i get around it if at all p ) 
Это довольно запрашивание монстра, я пишу. Очень быстрое описание базы данных: у вас есть таблица изображений, таблица Imagetag, которая присоединяется к эт...

1  Вызов статических методов с контекстами данных в LinqPad  ( Calling static methods with data contexts in linqpad ) 
Я использую LinqPAD для разработки нового метода доступа к данным. В способе, который выполняет запрос Linq-to-SQL против таблицы в myschemacontext, я использ...

4  Легко создавать таблицы базы данных из логической модели в .NET и VS  ( Easily create database tables from logical model in net and vs ) 
<Сильный> Фон: Я начал создавать логическую модель базы данных для веб-сайта ASP.NET MVC. Я использовал Visual Designer for Entity Framework, которые отпра...

126  Как хранить список в столбце таблицы базы данных  ( How to store a list in a column of a database table ) 
Так, per Ответ Мехрдада на связанный вопрос , I получим это , что «правильная» столбец таблицы базы данных не хранит список. Скорее, вам следует создать еще...

0  LINQ запрос из такой же таблицы с несколькими условиями  ( Linq query from same table with multiple conditions ) 
Мой текущий запрос, который я пытаюсь <код> public async Task<ActionStatus<IList<SelectedListViewModel>>> GetProjectMembersByClient(Guid clientId) { va...

0  EntityFramework включает  ( Entityframework include ) 
Это мое доменное использование для структуры сущности <код> public virtual Currency Currency { get; set; } public int DefaultCurrency { get; set; } public v...

1  Данные SQL представления не обновляются должным образом  ( Sql view data not updating properly ) 
У меня есть две таблицы (библиотеки и узлы) и вид, который присоединяется к двум таблицам (PaddyWhacks). Таблицы имеют следующие поля: <код> Knicks.key, Kni...

0  Linq 2 SQL Использование содержит [дубликат]  ( Linq 2 sql using contains ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

4  VS2010 с использованием SQL Server 2000  ( Vs2010 using sql server 2000 ) 
Есть ли способ использовать SQL Model (DBML) Builder в VS2010, используя SQLSERVER2000? Он отлично работает в VSexpress2008 + VS2008, но бросает ошибку «Обнов...

Связанный проблема

2  C #, Linq2SQL - трюки для получения объекта ViewModel с данными соотношения? 
13  Преобразование SQL Rank () на LINQ или Альтернатива 
1  Получение последних строк в результате выписки LINQ в SQL 
3  Linq to sql: iqueryable - String содержит - Метод не поддерживается перевод для SQL 
1  Linq к объекту SQL отмечает его, чтобы вставить автоматически 
8  Linq options.loadwith Проблема 
1  Союз на двух больших запросов LINQ не поддерживается. Как мне обойти его (если вообще возможно) 
1  Вызов статических методов с контекстами данных в LinqPad 
4  Легко создавать таблицы базы данных из логической модели в .NET и VS 
126  Как хранить список в столбце таблицы базы данных 
0  LINQ запрос из такой же таблицы с несколькими условиями 
0  EntityFramework включает 
1  Данные SQL представления не обновляются должным образом 
0  Linq 2 SQL Использование содержит [дубликат] 
4  VS2010 с использованием SQL Server 2000 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.