Silverlight使用linq to sql 域服务类不可用

Seabert2011 2012-04-16 09:33:49
Silverlight使用linq to sql 后域服务类显示空域服务类,使用ADO.NET 实体数据模型就有可选项,有人知道是怎么回事吗
...全文
1357 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bonjour-你好 2013-10-15
  • 打赏
  • 举报
回复
为何7月份没有看到sp1234大的这个回复
微恒软件 2013-10-15
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
例如在asp.net端,可以实现一个名为 QueryMSSL.ashx 的服务:
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Dynamic;
using System.Web;

namespace 你的命名空间
{
    public class QueryMSSQL : IHttpHandler
    {

        private const string ConnectionString = "Password=cutt;Persist Security Info=True;User ID=sa;Initial Catalog=TapWaterLeaders;Data Source=192.168.1.198";

        public void ProcessRequest(HttpContext context)
        {
            try
            {
                var sql = context.Server.UrlDecode(context.Request.QueryString["sql"]);
                using (var conn = new SqlConnection(ConnectionString))
                {
                    conn.Open();
                    var comm = conn.CreateCommand();
                    comm.CommandText = sql;
                    comm.CommandType = System.Data.CommandType.Text;
                    var result = new List<ExpandoObject>();
                    var reader = comm.ExecuteReader();
                    while (reader.Read())
                    {
                        var record = new ExpandoObject();
                        result.Add(record);
                        var dic = (IDictionary<string, object>)record;
                        for (var i = 0; i < reader.FieldCount; i++)
                            dic.Add(reader.GetName(i), reader[i]);
                    }
                    var jsonResult = JsonConvert.SerializeObject(result);   //将记录集合转换为json字符串
                    context.Response.ContentType = "text/plain";
                    context.Response.Write(jsonResult);
                }
            }
            catch
            {
                context.Response.StatusCode = 500;
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
这样,在url参数上输入任何sql语句,就可以访问SQL Server查询结果了。结果是以json对象集合方式返回的,不管客户端是什么平台,这种协议设计都是非常通用的、容易调试(甚至可以直接在浏览器上手工)、许多人都懂。 而silverlight端,可以实现这样的查询网关
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Net;
using System.Windows;
using System.Windows.Browser;

namespace SL端命名空间
{
    public static class Extensions
    {
        public static void QueryMSSQL(this string sql, Action<IEnumerable<dynamic>> callback)
        {
            if (callback != null)
            {
                var web = new WebClient();
                web.DownloadStringCompleted += (s, e) =>
                {
                    if (e.Error == null)
                    {
                        var result = JsonConvert.DeserializeObject<ExpandoObject[]>(e.Result);
                        callback(result);
                    }
                };
                var uri = new Uri(Application.Current.Host.Source, "../QueryMSSQL.ashx?sql=" + HttpUtility.UrlEncode(sql));
                web.DownloadStringAsync(uri);
            }
        }

    }
}
这样,你就得到了一个灵活的 dynamic[] 类型的数据集合。就好像那种老式的 DataTable 一样,你可以灵活地访问没一个记录和记录中的每一个字段。例如下面这个查询,不但使用sql语句在数据库端过滤,在客户端也可以灵活地读取查询到的数据集合的属性
var sql = "select * from MyTable where mm='春风' and age<23";
sql.QueryMSSL(result=>
{
    var lst = from u in result
              where (string)u.Department == '技术部' && (int)u.Salary<5000
              select u;
    window win= new 大幅度涨薪水操作画面();
    win.DataContext = lst.ToList();
    win.Show();
}
这里对于 dynamic 类型的数据,由于我们知道它其实就是 ExpandoObject 类型的对象,我们可以这样来枚举其属性
var dic= (IDictionary<string,object>)u;
foreach(var k in dic.Keys)
{
    var value = dic[k];
    .......
}
因此,虽然silverlgiht根本不支持ado.net中古老的什么DataTable之类的,但是完全不需要支持,现在的ExpandoObject无模式数据类型,要比DataTableRow更自然、更好用!
嗯,这种方式。新颖,不错,值得参考
  • 打赏
  • 举报
回复
引用 3 楼 grt 的回复:
我常遇到这个情况 改了实体,改了域,都必须分别 编译一下,还是不行的话,要退出vs2010 ,重新调入项目,就行了。
以前为了带3个不懂TCP和很少进行http通讯开发的人尽快使用Siverlight来开发,在3个月内必须完美上线,不足百万开发费的小项目,而且要有大量的动态数据分析图、GIS系统基本功能,需要跟另外十几个部门协调各种数据中心通讯接口,等要求,所以匆忙之间选择使用RIA Service。后来真心非常后悔。 如果当初直接这样写,那么一切都变得简单和自然了。
  • 打赏
  • 举报
回复
例如在asp.net端,可以实现一个名为 QueryMSSL.ashx 的服务:
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Dynamic;
using System.Web;

namespace 你的命名空间
{
    public class QueryMSSQL : IHttpHandler
    {

        private const string ConnectionString = "Password=cutt;Persist Security Info=True;User ID=sa;Initial Catalog=TapWaterLeaders;Data Source=192.168.1.198";

        public void ProcessRequest(HttpContext context)
        {
            try
            {
                var sql = context.Server.UrlDecode(context.Request.QueryString["sql"]);
                using (var conn = new SqlConnection(ConnectionString))
                {
                    conn.Open();
                    var comm = conn.CreateCommand();
                    comm.CommandText = sql;
                    comm.CommandType = System.Data.CommandType.Text;
                    var result = new List<ExpandoObject>();
                    var reader = comm.ExecuteReader();
                    while (reader.Read())
                    {
                        var record = new ExpandoObject();
                        result.Add(record);
                        var dic = (IDictionary<string, object>)record;
                        for (var i = 0; i < reader.FieldCount; i++)
                            dic.Add(reader.GetName(i), reader[i]);
                    }
                    var jsonResult = JsonConvert.SerializeObject(result);   //将记录集合转换为json字符串
                    context.Response.ContentType = "text/plain";
                    context.Response.Write(jsonResult);
                }
            }
            catch
            {
                context.Response.StatusCode = 500;
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
这样,在url参数上输入任何sql语句,就可以访问SQL Server查询结果了。结果是以json对象集合方式返回的,不管客户端是什么平台,这种协议设计都是非常通用的、容易调试(甚至可以直接在浏览器上手工)、许多人都懂。 而silverlight端,可以实现这样的查询网关
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Net;
using System.Windows;
using System.Windows.Browser;

namespace SL端命名空间
{
    public static class Extensions
    {
        public static void QueryMSSQL(this string sql, Action<IEnumerable<dynamic>> callback)
        {
            if (callback != null)
            {
                var web = new WebClient();
                web.DownloadStringCompleted += (s, e) =>
                {
                    if (e.Error == null)
                    {
                        var result = JsonConvert.DeserializeObject<ExpandoObject[]>(e.Result);
                        callback(result);
                    }
                };
                var uri = new Uri(Application.Current.Host.Source, "../QueryMSSQL.ashx?sql=" + HttpUtility.UrlEncode(sql));
                web.DownloadStringAsync(uri);
            }
        }

    }
}
这样,你就得到了一个灵活的 dynamic[] 类型的数据集合。就好像那种老式的 DataTable 一样,你可以灵活地访问没一个记录和记录中的每一个字段。例如下面这个查询,不但使用sql语句在数据库端过滤,在客户端也可以灵活地读取查询到的数据集合的属性
var sql = "select * from MyTable where mm='春风' and age<23";
sql.QueryMSSL(result=>
{
    var lst = from u in result
              where (string)u.Department == '技术部' && (int)u.Salary<5000
              select u;
    window win= new 大幅度涨薪水操作画面();
    win.DataContext = lst.ToList();
    win.Show();
}
这里对于 dynamic 类型的数据,由于我们知道它其实就是 ExpandoObject 类型的对象,我们可以这样来枚举其属性
var dic= (IDictionary<string,object>)u;
foreach(var k in dic.Keys)
{
    var value = dic[k];
    .......
}
因此,虽然silverlgiht根本不支持ado.net中古老的什么DataTable之类的,但是完全不需要支持,现在的ExpandoObject无模式数据类型,要比DataTableRow更自然、更好用!
  • 打赏
  • 举报
回复
可以扔掉RIA Service,直接使用你的ashx传送json数据,然后再silverlight端直接解析为 ExpandoObject[] 类型的数据集合。
  • 打赏
  • 举报
回复
引用 5 楼 mrzjc1 的回复:
我也遇到同样问题,经过几天的折腾,最后得到正确解答----少安装了一个东西。 到微软下载 RIAServicesTookit.msi 安装后就好了。
应该是这个问题,我以前也遇到过。
mrzjc1 2013-07-11
  • 打赏
  • 举报
回复
我也遇到同样问题,经过几天的折腾,最后得到正确解答----少安装了一个东西。 到微软下载 RIAServicesTookit.msi 安装后就好了。
天涯草 2013-07-01
  • 打赏
  • 举报
回复
楼主是怎么解决问题的啊?着急等。。
grt 2012-04-19
  • 打赏
  • 举报
回复
我常遇到这个情况

改了实体,改了域,都必须分别

编译一下,还是不行的话,要退出vs2010 ,重新调入项目,就行了。
Seabert2011 2012-04-18
  • 打赏
  • 举报
回复
基于linq to sql的域服务类DomainService.cs中,那个"可用datacontext"下拉框显示空域服务类,无法选择我刚刚建好的linq to sql类。
http://hiphotos.baidu.com/zhidao/pic/item/e7cd7b89c2de9dd10f244495.jpg
海涵德 2012-04-16
  • 打赏
  • 举报
回复
说的详细点

8,756

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧