2009-11-23 3 views
0

Я использую классы LINQ to SQL и расширил один (с частичным классом) и добавил дополнительное свойство. Я хочу запросить об этом свойстве, поэтому:LINQ to SQL Пользовательский запрос свойства по запросу where

(from p in db.TableName where p.CustomProperty=="value" select p) 

Однако это не сработает. Я получаю сообщение об ошибке: The member 'TableName.CustomProperty' has no supported translation to SQL. На данный момент у меня нет кода в разделе «set» моего пользовательского свойства, поскольку я не уверен, как это сделать.

В основном, пользовательское свойство, на которое можно запросить LINQ to SQL, как?

В качестве продолжения: этот CustomProperty НЕ является столбцом в таблице. Это отдельное значение, но мне нужно как извлечь его (достаточно просто), но и запросить его!

ответ

0

Вам не хватает знака равенства? В C# равенство выражается двойными равными знаками, как в «a == b», в то время как знак одного равенства обозначает назначение, как в «obj.SomeProp = 5;»

+0

Да, это была просто опечатка, когда я добавил какой-то пользовательский код ...даже если я делаю a == он все еще не работает – Mark

1

Он называется LINQ to SQL. Просто чтобы избежать недоразумений.

О вашей проблеме: добавили ли вы эту собственность с помощью дизайнера? И после этого вы заново создали базу данных?

Если вы сделали это вручную, убедитесь, что у вас есть личное поле для хранения (например, _CustomProperty), и ваша собственность (CustomProperty) отмечена атрибутом ColumnAttribute, например.

private string _CustomProperty; 

[Column(Storage="_CustomProperty", CanBeNull=true)] 
public string CustomProperty 
{ 
    get { return _CustomProperty; } 
} 

Надеюсь, это поможет.

+0

Его не столбец в базе данных или таблице, его отдельный фрагмент информации, но мне нужно запросить его – Mark

+0

Если это не столбец таблицы, вы не можете запросить это в выражении LINQ to SQL, поэтому ответ archimed7592 наиболее адекватен. Вы можете пойти и построить пользовательский IQueryable провайдер, как намекнул BlueMonkMN, но я не думаю, что вам это нужно, не так ли? – ShdNx

2

Как вы можете понять, не может быть никакой магии, так что по существу будут два запроса: во-первых, это SQL-запрос с критериями базы данных, и по его результату должны применяться ваши пользовательские критерии в качестве второго запроса.

Так обходной путь вы могли бы использовать, чтобы разделить две части явно, как это:

var dbFetch = (from p in db.TableName where p.RealProperty ==" value" select p).ToArray(); 
var result = from p in dbFetch where p.CustomProperty == "value" select p; 

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

НТН

0

я реализовал систему, в которой вы можете запросить вручную добавлены свойства, которые представляют собой перечисленные обертки вокруг целочисленных свойств из столбцов базы данных. Поэтому я знаю, что это возможно, и похоже, что вы, возможно, захотите сделать что-то подобное. То, как я это делал, было непростым, и если вы не строите фреймворк, который вы хотите использовать правильно для многих случаев, вам может быть лучше использовать решение, предложенное archimed7592. В настоящий момент у меня нет кода, поэтому я не могу предоставить все детали, но вкратце мое решение работает так. Я создал собственный поставщик LINQ, заменив поставщика LINQ-to-SQL. Я сделал это, реализовав пользовательский интерфейс IQueryable, который вернул мой LINQ-провайдер, а не LINQ-to-SQL. Затем в функциях, которые принимают объекты выражения, я предварительно обработал выражение перед возвратом результата. Я заменил все сравнения между свойствами enum-type и значениями перечисления со сравнением между целыми свойствами и целыми значениями, а затем передал это выражение в обычную реализацию LINQ-to-SQL, чтобы вернуть результат. Поскольку выражения доступны только для чтения, мне пришлось создать (рекурсивную) функцию, которая перестроила бы все выражение с замененными частями.

Смежные вопросы