использование .Equals () не удалось в Predicatebuilder - PullRequest
1 голос
/ 13 февраля 2012

Привет! Я использую Predicate Builder для создания предложения where. Я заметил, что он делает сравнение с учетом регистра данных источника данных. Некоторый быстрый поиск в Google подразумевает, что это особенность linqtoentities. поэтому мне пришлось изменить свой код, чтобы сделать

whereClause = whereClause.And(x => x.county.Equals(oSearch.County, StringComparison.OrdinalIgnoreCase ));

, а не ранее

whereClause = whereClause.And(x => x.county == oSearch.County);

Проблема в том, что теперь, похоже, не удается создать предложение where.

кстати, я использую код ниже, который работал раньше.

var tbl = db.tbl_members.AsExpandable().Where(whereClause.Compile());

У меня есть код, который выполняет foreach (элемент var в Model), теперь он завершается с ошибкой «Ссылка на объект не установлена ​​на экземпляр объекта» если я рассматриваю модель, используя быстрый просмотр, она теперь показывает это

tblMembers = {System.Linq.Enumerable.WhereEnumerableIterator<tbl_members>}

вместо

  tblMembers = {SELECT [Extent1].[id] AS [id], 
[Extent1].[membership_id] AS [membership_id], 
[Extent1].[membership_type] AS [membership_type], 
[Extent1].[institution] AS [institution], 
[Extent1].[full_name] AS [full_name], 
[Extent1].[address1] AS [address1], 
...

, который он показал ранее, независимо от каких-либо результатов.

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Проблема в том, что у linq есть перевод для

whereClause = whereClause.And(x =>
x.county.Equals(oSearch.County,StringComparison.OrdinalIgnoreCase )

в sql.Вы можете попробовать:

whereClause = whereClause.And(x => x.county.ToLower()==oSearch.County.ToLower());
0 голосов
/ 13 февраля 2012

Учитывая это:

tblMembers = {System.Linq.Enumerable.WhereEnumerableIterator<tbl_members>}

похоже, что вы случайно используете LINQ to Objects. Проверьте, действительно ли ваша копия PredicateBuilder соответствует деревьям выражений (Expression<Func<T, bool>>) или делегатам (Func<T, bool>) - вам следует использовать деревья выражений.

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, это проблема:

var tbl = db.tbl_members.AsExpandable().Where(whereClause.Compile());

Это компилирует дерево выражений в делегат, а затем вызывает Enumerable.Where. Без звонка Compile():

var tbl = db.tbl_members.AsExpandable().Where(whereClause);

... в итоге мы вызываем Queryable.Where, используя дерево выражений, которое затем можно преобразовать в SQL.

...