Простейшим способом было бы использовать select qty wavg price from t
, однако замена select
на exec
вернет атомное значение, а не таблицу, которая может лучше удовлетворить ваши потребности
exec qty wavg price from t
wavg вычислил средневзвешенная цена
Я обнаружил, что если я сделаю конструктор по умолчанию для моего класса, то мой веб-метод возвращает что-либо, кроме public, он не будет сериализовать часть __ type: ClassName
.
Вы можете объявить ваш конструктор по умолчанию внутренним защищенным ClassName () {}
Не используйте атрибут [Serializable].
Следующее должно просто сделать это
JavaScriptSerializer ser = new JavaScriptSerializer (); string json = ser.Serialize (objectClass);
Я не уверен, что это хорошее решение, но если вы используете библиотеку Json.net , вы можете игнорировать некоторые свойства, добавив атрибут [JsonIgnore].
Это должно решить проблему.
В частном методе SerializeValue метода JavaScriptSerializer в System.WebExtensions.dll, __type добавляется во внутренний словарь, если он может быть разрешен.
Из Reflector:
private void SerializeValue(object o, StringBuilder sb, int depth, Hashtable objectsInUse)
{
if (++depth > this._recursionLimit)
{
throw new ArgumentException(AtlasWeb.JSON_DepthLimitExceeded);
}
JavaScriptConverter converter = null;
if ((o != null) && this.ConverterExistsForType(o.GetType(), out converter))
{
IDictionary<string, object> dictionary = converter.Serialize(o, this);
if (this.TypeResolver != null)
{
string str = this.TypeResolver.ResolveTypeId(o.GetType());
if (str != null)
{
dictionary["__type"] = str;
}
}
sb.Append(this.Serialize(dictionary));
}
else
{
this.SerializeValueInternal(o, sb, depth, objectsInUse);
}
}
Если тип не может быть определен, сериализация все равно будет продолжена, но тип будет проигнорирован. Хорошей новостью является то, что поскольку анонимные типы наследуют getType() и возвращаемые имена динамически генерируются компилятором, TypeResolver возвращает null для ResolveTypeId и атрибут "__type" впоследствии игнорируется.
Я также воспользовался советом Джона Моррисона с внутренним конструктором на всякий случай, хотя, используя только этот метод, я все равно получал свойства __type в моем JSON-ответе.
//Given the following class
[XmlType("T")]
public class Foo
{
internal Foo()
{
}
[XmlAttribute("p")]
public uint Bar
{
get;
set;
}
}
[WebService(Namespace = "http://me.com/10/8")]
[System.ComponentModel.ToolboxItem(false)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class MyService : System.Web.Services.WebService
{
//Return Anonymous Type to omit the __type property from JSON serialization
[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public object GetFoo(int pageId)
{
//Kludge, returning an anonymois type using link, prevents returning the _type attribute.
List<Foo> foos = new List<Foo>();
rtnFoos.Add( new Foo(){
Bar=99
}};
var rtn = from g in foos.AsEnumerable()
select g;
return rtn;
}
}
Примечание: Я использую унаследованный конвертер типов JSON, который считывает атрибуты XML Serialization из сериализованных типов для дальнейшего сжатия JSON. Благодаря CodeJournal. Работает как шарм.