Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)

Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)

目录

  • 导言
  • 软件需求
  • 数据库实现
  • Data Access层实现
  • Web Service层实现
  • Silverlight客户端实现
  • 结语

上一篇:Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)

上一篇,我们完成了这个程序的前面部分,这一篇,我们继续下面的操作。

Silverlight客户端实现

这个部分主要完成Silverlight客户端的操作,首先引用WCF服务,然后在Page页面中,我们使用DataGrid控件来实现对数据的绑定,另外,添加一个用户控件实现增加、删除、修改操作处理。下面一步一步来实现这些步骤吧。

第一步:引用WCF服务

引用WCF服务

第二步:添加一个用户控件

添加用户控件

第三步:编辑用户控件界面

为了演示方面,我没有做任何的界面美化,仅仅把数据库相应的字段在TextBox上实现双向绑定,即在任何时候都可以同时更新源数据和目标。提供了保存,删除,添加按钮实现数据操作事件。

编辑用户控件界面

绑定代码像这样,类似的,可以写出其它的代码。

<TextBox x:Name="txtProductType" 
         Text="{Binding ProductType, Mode=TwoWay}" />

第四步:编辑用户控件事件

这一步比较复杂,这里分小点讨论。为了调用WCF服务,先定义一下全局变量。

AcademeServiceClient academeSClient;

1.定义事件

由于实时需要Page页的DataGrid控件和用户控件的更新,这里引用事件委托机制,所以先对外定义一些公共的事件和绑定数据方法。在Page页上实现一些方法,比如添加、删除、更新数据之后刷新列表。

//添加Product事件
public delegate void ProductUpdatedHandler
   (object source, Product product);
public event ProductUpdatedHandler ProductUpdated;
//删除Product事件
public delegate void ProductDeletedHandler(object source);
public event ProductDeletedHandler ProductDeleted;
//编辑取消事件
public delegate void ProductEditCancelHandler(object source);
public event ProductEditCancelHandler ProductEditCancel;
//绑定数据方法
public void SetProduct(Product product)
{
    this.DataContext = product;
}

2.更新数据

这是保存按钮触发的事件,利用DataContext属性获取TextBox上面的值,异步调用SaveProduct方法实现更新和添加数据操作。这里更新和添加数据就是利用ProductID的值,添加数据的时候ProductID默认为0,不为0的时候就是更新数据,在SaveProduct方法中已经强调过了。

txtMessage.Text = "正在保存";
Product product = (Product)this.DataContext;
academeSClient.SaveProductCompleted +=
    new EventHandler<SaveProductCompletedEventArgs>
    (academeSClient_SaveProductCompleted);
academeSClient.SaveProductAsync(product);

在完成调用方法后,给出了一些提示性的文字。调用ProductUpdated方法刷新列表。

void academeSClient_SaveProductCompleted
(object sender, SaveProductCompletedEventArgs e)
{
    txtMessage.Text = "更新成功";
    ProductUpdated(this, e.Result);
}

3.添加数据

点击添加按钮,新建Product 实例,然后点击保存按钮,实现保存操作,在保存事件中,既可以用于保存又可以用户新建。这里的添加数据事件仅仅给用户一个提示,但是需要保存到数据库,还需要点击上面的保存按钮。

if (btnAddNew.Content == "取消")
{
    btnAddNew.Content = "添加";
    btnDelete.IsEnabled = true;

    if (ProductEditCancel != null)
        ProductEditCancel(this);
}
else
{
    Product product = new Product();
    this.DataContext = product;
    btnDelete.IsEnabled = false;
    btnAddNew.Content = "取消";
}

4.删除数据

同添加数据一样,获取数据,然后异步调用DeleteProduct方法删除这条数据。

txtMessage.Text = "正在删除";
Product product=(Product)this.DataContext;
academeSClient.DeleteProductCompleted+=
    new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>
    (academeSClient_DeleteProductCompleted);
academeSClient.DeleteProductAsync(product);

在完成调用之后,给出了一些提示。调用ProductUpdated方法刷新列表。

void academeSClient_DeleteProductCompleted
(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    txtMessage.Text = "删除成功";
    if (ProductDeleted != null)
        ProductDeleted(this);
}

第五步:编辑Page页面

1.前台页面

前台显示页面,非常简单,我就放置了DataGrid控件和一个用户控件。

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="200"/>
        <RowDefinition Height="400"/>
    </Grid.RowDefinitions>
    <my:DataGrid x:Name="grdProducts" IsReadOnly="True" 
                Margin="14" Grid.Row="0"
                AutoGenerateColumns="True"
                GridlinesVisibility="All"
                RowDetailsVisibility="Visible"
                SelectionChanged="grdProducts_SelectionChanged"/>
  <Academe:ProductDetail x:Name="ProductDetailShow" Grid.Row="1"/>
</Grid>

2.查询数据

在Page()方法中,直接异步调用GetAllProducts方法获取数据,绑定到DataGrid控件上面。

academeSClient.GetAllProductsCompleted +=
    new EventHandler<GetAllProductsCompletedEventArgs>
        (academeSClient_GetAllProductsCompleted);
academeSClient.GetAllProductsAsync();

在完成调用之后,获取数据,绑定到控件上面。

void academeSClient_GetAllProductsCompleted(object sender,
    GetAllProductsCompletedEventArgs e)
{
    Product[] products = e.Result;
    grdProducts.ItemsSource = products;
}

3.SelectionChanged事件

当选中某一项时,触发这个事件,获取选中的项,调用用户控件对外提供的SetProduct方法绑定到TextBox上。

private void grdProducts_SelectionChanged
(object sender, EventArgs e)
{
    Product productEntity = (Product)grdProducts.SelectedItem;
    ProductDetailShow.SetProduct(productEntity);
}

4.完善程序

接下来,我们还需要写一些事件完善这个程序,首先我们完成在用户控件中定义的三个公共的事件。

ProductDetailShow.ProductUpdated += 
    new ProductDetail.ProductUpdatedHandler
    (ProductDetailShow_ProductUpdated);
    
ProductDetailShow.ProductEditCancel +=
    new ProductDetail.ProductEditCancelHandler
    (ProductDetailShow_ProductEditCancel);
    
ProductDetailShow.ProductDeleted +=
    new ProductDetail.ProductDeletedHandler
    (ProductDetailShow_ProductDeleted);

实现这些事件方法,这些方法就是起到刷新列表,获取选中项的作用。

void ProductDetailShow_ProductDeleted(object source)
{
    //删除选中的Product,重新绑定数据源
    List<Product> products = new List<Product>
    (grdProducts.ItemsSource as Product[]);
    products.Remove(grdProducts.SelectedItem as Product);
    grdProducts.ItemsSource = products.ToArray<Product>();
}

void ProductDetailShow_ProductEditCancel(object source)
{
    //获取选择的Product
    Product productEntity = (Product)grdProducts.SelectedItem;
}

void ProductDetailShow_ProductUpdated
     (object source, Product product)
{
    //刷新列表
    academeSClient.GetAllProductsAsync();
}

最后来个整个项目截图

程序整体截图

结语

本篇程序分为3层架构,在数据访问层LINQ to SQL,在Web Service层使用WCF,最后在客户端Silverlight完成调用。

这个Silverlight项目被我弄的好像复杂了,这下顺便学习了用户控件事件的调用,不过这样增强了用户体验,不像上几篇所说的,各个用户控件好像很独立,没有很好的结合起来。这仅仅提供这个方法很好的结合用户控件把这个程序整合的很完善了。最后说一下,这里全部的代码都贴出来了,大家只要按步骤来,可以完成这个程序的,源代码就不提供下载了,因为我这个项目在使用中,还在扩充。大家也可以扩充,比如在DataGrid中嵌套一些控件显示图片,类型等等。


作者:李永京YJingLee's Blog
出处:http://lyj.cnblogs.com
转载请注明此处,谢谢!

posted @ 2008-04-23 17:23 李永京 阅读(2605) 评论(64)  编辑 收藏 所属分类: Silverlight

  回复  引用  查看    
#1楼 2008-04-23 17:31 | good man      
第一个支持一下,李哥,你可不可以把你的写的这些文章做成一个
CHM文档啊,这样更好啊,
我们一直关注你的啊


  回复  引用  查看    
#2楼 [楼主]2008-04-23 17:40 | 李永京      
@good man
呵呵,现在这几天打算修改一下全部文章的排版,准备换下模板。等下个星期弄个CHM文档提供下载。
  回复  引用    
#3楼 2008-04-24 00:54 | hyh [未注册用户]
一个偶然的机会,看到你的博客,从此一直默默地关注你,加油,永京!
  回复  引用  查看    
#4楼 [楼主]2008-04-24 10:07 | 李永京      
@hyh
谢谢支持,o(∩_∩)o...
  回复  引用  查看    
#5楼 2008-04-24 10:38 | 镜涛      
学习开始应用silverlight
  回复  引用  查看    
#6楼 [楼主]2008-04-24 11:07 | 李永京      
@镜涛
现在学习还不迟,呵呵
  回复  引用  查看    
#7楼 2008-04-24 11:43 | tivan      
sliveright 网站怎么部署到server 2003 机器上,有什么特别的设置,
我机上看到的都是空白的。
  回复  引用  查看    
#8楼 [楼主]2008-04-24 12:34 | 李永京      
@tivan
部署还是开发啊,部署看http://www.cnblogs.com/winkingzhang/archive/2008/03/19/1113512.html 翻译的文章。
  回复  引用  查看    
#9楼 2008-04-24 13:28 | tivan      
搞定。谢谢!
  回复  引用  查看    
#10楼 [楼主]2008-04-24 16:30 | 李永京      
@tivan
OK
  回复  引用    
#11楼 2008-04-24 23:38 | 权权 [未注册用户]
偶也来顶一下永京哥,呵呵..加油!!偶其实也在关注Silverlight..
  回复  引用  查看    
#12楼 [楼主]2008-04-24 23:45 | 李永京      
@权权
谢谢支持!
我在page.cs中怎么调用添加到linq to sql 中的表类?
要自己建立相同的类吗?
例如:
void academeSClient_GetAllProductsCompleted(object sender,
GetAllProductsCompletedEventArgs e)
{
Product[] products = e.Result;
grdProducts.ItemsSource = products;
}
中的Product类。
  回复  引用  查看    
#14楼 [楼主]2008-05-04 13:01 | 李永京      
@lihaidong
引用一下就可以了,这个方法写在button事件中,像academeSClient.SaveProductCompleted +=
new EventHandler<SaveProductCompletedEventArgs>
(academeSClient_SaveProductCompleted);
,然后在完成时,写void academeSClient_GetAllProductsCompleted(object sender,
GetAllProductsCompletedEventArgs e)
{
Product[] products = e.Result;
grdProducts.ItemsSource = products;
}
方法。linq to sql的类可以直接使用的,不需要什么设置。

@李永京
怎样引用?我在wcf中可直接使用但是在page.cs中不能使用。
@李永京
明白了,谢谢你
  回复  引用  查看    
#17楼 [楼主]2008-05-04 13:33 | 李永京      
@lihaidong
第一步,引用wcf服务引用过了,这个类就可以直接调用的,不需要设置什么的。
@李永京
还是不可以,引用过wcf后,还是不能引用这个类
@李永京
怎么手动添加这个类的引用?
  回复  引用  查看    
#20楼 [楼主]2008-05-04 17:26 | 李永京      
@lihaidong
这个不要添加的啊,或者你哪一步没有做或者做错了。
@李永京
呵呵,弄好了,我知道是怎么回事了.好像在wcf中没有用到的类不能引用过去
谢谢你
  回复  引用  查看    
#22楼 [楼主]2008-05-04 20:25 | 李永京      
@lihaidong
不客气,在wcf中的东东只要引用过来了,都可以调用的。呵呵
您好,再请教你一个问题,在sl里使用LINQ TO SQL实现上传本地图片到数据库,数据库中的表PICTURE中有列项IMAGESOURCE,类型为image。
我将本地图片读到了byte[] file里。

PICTURE pic=new PICTURE();
PIC.IMAGESOURCE=file;
这里出现了错误,说不能将byte [] 类型转换成Binary。
这个问题怎么解决?是我的方法有问题吗?您还有其他的方法吗?

  回复  引用  查看    
#24楼 [楼主]2008-05-06 20:21 | 李永京      
@lihaidong
不好意思,现在才看见回复
可以上传的,但是不是上传到数据库里,上传到服务器上,把流数据转换为一个字节数组,把它发送到服务器上。如果上传的文件大于8024字节BasicHttpBinding的MaxBufferSize必须修改
@李永京
真是太感谢你了,通过看你的文章和你的回答,我解决很多问题,再次感谢
我修改了ServiceReferences.ClientConfig中的BasicHttpBinding的MaxBufferSize,但是还是不能传送比较大的图片,50kB的都不可以。我应该怎么修改?
  回复  引用  查看    
#27楼 [楼主]2008-05-07 12:23 | 李永京      
@lihaidong
现在SL bate1还不支持读取配置文件,需要在后台写代码
你设置MaxReceivedMessageSize属性:
System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.MaxReceivedMessageSize = int.MaxValue;
数据超过默认大小就会抛出下面一个异常:
An exception of type 'System.ServiceModel.CommunicationException' occurred in System.ServiceModel.dll but was not handled in user code
Additional information: [MaxReceivedMessageSizeExceeded]




他抛出的异常是
An exception of type 'System.ServiceModel.ProtocolException' occurred in System.ServiceModel.dll but was not handled in user code
  回复  引用  查看    
#29楼 [楼主]2008-05-07 12:33 | 李永京      
@lihaidong
我这里写的实例代码是asm的,wcf还需要修改一下。
@李永京
具体怎么修改我不知道在哪里添加代码?
我是这样改的
binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;
endpointaddress = new EndpointAddress("http://localhost:58529/ImageManager/PictureService.svc");
OperationServiceReference.PictureServiceClient PictureWS = new PictureServiceClient(binding, endpointaddress);
  回复  引用  查看    
#31楼 [楼主]2008-05-07 16:11 | 李永京      
@lihaidong
int.MaxValue可以换成具体值,就在在原来新建这个的时候额外添加MaxReceivedMessageSize属性值,用法很平常一样。
@李永京
我这里只能传10KB左右的图片,传大一点的图片会有这个异常
An exception of type 'System.ServiceModel.ProtocolException' occurred in System.ServiceModel.dll but was not handled in user code

MaxReceivedMessageSize的默认值为65536 ,就算我没有修改正确,也应该能上传50KB的图片啊。
这个异常到底是什么意思?我在网上也每找到相关信息
  回复  引用  查看    
#33楼 [楼主]2008-05-07 17:41 | 李永京      
@lihaidong
具体我也不是很清楚,这东西这几天没有学习了,哎,可能你的原因
参考:http://msdn.microsoft.com/zh-cn/library/cc197955(en-us,VS.95).aspx
http://blogs.msdn.com/carlosfigueira/archive/2008/03/07/enabling-cross-domain-calls-for-silverlight-apps-on-self-hosted-web-services.aspx
现在Bate1还不是很成熟,只是学习一下,至于项目还是考虑用成熟的技术,不要用最新的技术,我过些天再学习了,这几天忙。
  回复  引用  查看    
#34楼 2008-05-16 15:42 | 傻样精英      
建议先搞个winform测试一下你的服务,估计是服务出了问题
我头几天也是报了这个错误
  回复  引用  查看    
#35楼 [楼主]2008-05-16 17:21 | 李永京      
@傻样精英
唉,这个问题非常普遍~~不过知道原理就可以解决~~
  回复  引用  查看    
#36楼 2008-05-21 00:44 | 傻样精英      
请问博主:
如果实体声明了版本成员或者没有更新检查策略,则只能将它附加为没有原始状态的已修改实体
出现了这种情况改怎么办?搜了一下也没搜着
  回复  引用  查看    
#37楼 [楼主]2008-05-21 16:42 | 李永京      
@傻样精英
你可以分开写啊,更新写更新操作,添加写新建操作,并非像我这样弄在一起了
  回复  引用    
#38楼 2008-05-27 17:10 | donggs [未注册用户]
老师,Silverlight +WCF 发布问题
我用Silverlight+WCF+LINQ作了一个网站,可以在本地运行,但是发布到IIS7上时,与数据库有关的功能无法运行。
这是什么原因阿
  回复  引用  查看    
#39楼 [楼主]2008-05-27 21:50 | 李永京      
@donggs
我的例子都是使用了硬编码方式,这样做的话将来部署服务器将带来一点麻烦,可能在配置文件添加一些配置。
你的wcf service和silverlight在同一个服务器上,所以,当你创建wcf Service binding,你可以指定你的服务绑定到基于当前浏览器的URL地址。
public static string GetUrlForResource(string resourcePage)
{
string webUrl = System.Windows.Browser.HtmlPage.Document.DocumentUri.ToString();
string containerPage = webUrl.Substring(webUrl.LastIndexOf("/") + 1);
webUrl = webUrl.Replace(containerPage, resourcePage);
return webUrl;
}
在Silverlight程序中,使用上面的方法,使用的时候传递一个参数"AcademeService.svc,这个方法返回这个页面实际的URL绑定的时候,用下面的方法就可以了,
string webServiceUrl = GetUrlForResource("AcademeService.svc");
希望对你有所帮助
  回复  引用    
#40楼 2008-05-28 13:30 | donggs [未注册用户]
老师你好:

我现在的现象是发布后地址是localhost 可以查询数据库,换成本机IP就出为处理的异常了


比如http://localhost:52666/donggs.Academe_Web/test.aspx
正常。

比如http://192.168.20.56:52666/donggs.Academe_Web/test.aspx
错误。
错误提示 发生了未处理的异常 Sys.InvalidOperationException:
ManageRuntimeError error #4002 in control 'Xaml1':
System.ServiceModel.CommunicationException:[CrossDomainError]
Arguments:

  回复  引用  查看    
#41楼 [楼主]2008-05-28 15:44 | 李永京      
@donggs
使用上面的方法编码获取当前URL啊,不要硬编码URL地址。
  回复  引用    
#43楼 2008-05-29 17:27 | donggs [未注册用户]
老师:


我按照微软的提示,参考了很多网站 ,增加了clientaccesspolicy.xml和
crossdomain.xml,那两个文件也放到 C:\Inetpub\wwwroot里了
还是不好用 相同的提示


老师你有QQ吗 或者我把程序发到你的邮箱里,这个问题我已经想了一个周了,总是解决不了。


你能帮我解决吗? 非常感谢!
  回复  引用  查看    
#44楼 [楼主]2008-05-30 10:21 | 李永京      
@donggs
呵呵,上面回复的朋友都解决了一些问题,你怎么不能解决呢?一些小错误是很好找的,你先用硬编码方式把功能实现,最后一步在考虑部署问题。
  回复  引用    
#45楼 2008-05-30 10:31 | 7069 [未注册用户]
@李永京
呵呵,上面回复的朋友都解决了一些问题,你怎么不能解决呢?一些小错误是很好找的,你先用硬编码方式把功能实现,最后一步在考虑部署问题。
____________________________________________
请问跨域调用如何用硬编码的方式实现啊???

先搞懂clientaccesspolicy.xml是什么?
  回复  引用  查看    
#46楼 [楼主]2008-05-30 12:52 | 李永京      
@7069
从文字上理解就是跨域操作的权限问题。
至于crossdomain.xml和clientaccesspolicy.xml如何使用是这样的:
比如我的webservice目录叫做WSProject,引用地址是http://localhost/WSProject/webservice.asmx,那么silverlight不是在http://localhost/WSProject这个目录下找crossdomain.xml和clientaccesspolicy.xml,而是在http://localhost/下找这两个文件.所以假如你的IIS默认目录是C" target="_new">http://localhost/WSProject/webservice.asmx,那么silverlight不是在http://localhost/WSProject这个目录下找crossdomain.xml和clientaccesspolicy.xml,而是在http://localhost/下找这两个文件.所以假如你的IIS默认目录是C:\inetpub\wwwroot的话,服务文件是部署在C:\inetpub\wwwroot\WSProject下,那么crossdomain.xml和clientaccesspolicy.xml这样的文件一定要放在C:\inetpub\wwwroot而不是http://localhost/WSProject.
另外更多的时候,对于初学者做相关教程的时候,按照教程里的步骤,最后点VS2008里运行的时候,通常是把silverlight程序作为启动项目.我在做到这里的时候就遇到了本文所涉及到的问题.我发现这个时候在项目里添加crossdomain.xml或clientaccesspolicy.xml是无济于事的.VS的小型服务器会给你提供这样的测试环境,http://localhost:端口号/项目名/网页名,如前所述是注定找不到这两个文件的,所以,还是把服务文件先部署到IIS上然后再测试吧.
参见:http://www.cnblogs.com/aspnetx/archive/2008/04/19/1161734.html
  回复  引用  查看    
#47楼 2008-06-02 16:16 | 平静中的疯狂      
又看一篇,再看一篇:D
  回复  引用  查看    
#48楼 [楼主]2008-06-02 16:37 | 李永京      
@平静中的疯狂
就到这里吧,下面没有了,关于数据操作就这么多内容了,不多上面回复的问题很值得你参考一下~~
  回复  引用    
#49楼 2008-06-24 16:56 | wbixd [未注册用户]
为什么Product[] products = e.Result 我测试的时候总是显示

无法将类型“System.Collections.ObjectModel.ObservableCollection<YJingLee.Academe.AcademeService.Product>”隐式转换为“YJingLee.Academe.AcademeService.Product[]” E:\wwwroot\silverlight\SL\YJingLee.Academe\YJingLee.Academe\Page.xaml.cs 27 33 YJingLee.Academe

李老师找了好久都不知道什么原因?是不是要在AcademeService里面些个Product[]什么的
  回复  引用    
#50楼 2008-06-24 17:24 | wbixd [未注册用户]
忘了说了我用的是silverlight 2 beta2
  回复  引用  查看    
#51楼 [楼主]2008-06-24 18:29 | 李永京      
@wbixd
对于sl2 Beta1和Beta2直接有一些不一样了,不能完全套用Beta1的代码了,对于Beta2有了一些改进。既然出现了这个错误,就是类型问题,把.Academe.AcademeService.Product类型换成Product[]类型看看了,最近也没有看sl了,没有自己亲自试试,不好意思。
  回复  引用  查看    
#52楼 2008-06-25 11:39 | 小牛大牛      
这两片文章太好了,正是我疑惑的地方,请问可以吧源代码共享一下么??呵呵....
  回复  引用    
#53楼 2008-06-25 11:59 | wbixd [未注册用户]
@李永京
已经解决问题了

ObservableCollection<Product> product = e.Result; 就可以了

3Q
  回复  引用  查看    
#54楼 [楼主]2008-06-25 12:13 | 李永京      
@小牛大牛
不好意思,这个代码是Beta1 的,现在Beta2了,我上面的代码全部贴出来了,没有源码,你照我的步骤做做也不错,遇到问题回复留言
  回复  引用  查看    
#55楼 [楼主]2008-06-25 12:14 | 李永京      
@wbixd
o(∩_∩)o... 自己也没有试试和更新,给你添麻烦了。
  回复  引用    
#56楼 2008-06-30 21:54 | 问题总是很多 [未注册用户]
Product[] products = e.Result;
这里我怎么提示无法隐式的类型转换呢?
而且我也无法在sl中直接引用Product,而是使用wcf名.Product的方式来完成引用的。不知道怎么解决?
  回复  引用  查看    
#57楼 [楼主]2008-06-30 21:57 | 李永京      
@问题总是很多
ObservableCollection<Product> product = e.Result; 就可以了 现在Beta2了,要进行修改了哦
  回复  引用    
#58楼 2008-06-30 22:04 | 问题总是很多 [未注册用户]
看到最后才发现我的问题和wbixd的一样。我的版本也是bata2。要using了using System.Collections.ObjectModel 才可以ObservableCollection<Academe.AcademeService.Product> product = e.Result;
  回复  引用    
#59楼 2008-06-30 22:06 | 问题总是很多 [未注册用户]
没看到这么快就回复了!赞一个哈^_^
  回复  引用  查看    
#60楼 [楼主]2008-06-30 22:12 | 李永京      
@问题总是很多
哎,也是,改动不大,自己也没有时间去更新到Beta2版本。原理清楚就可以了哦。
  回复  引用    
#61楼 2008-06-30 22:30 | 问题总是很多 [未注册用户]
@李永京
现在也只能看着你的照猫画虎,要学的好多啊!一边看这边的sl,一边还要看你那边的linq...
想问个问题,比如在WCF中的GetAllProducts()里的linq语句使用了group by,那么返回的list应该不是Product类型了吧。是不是要自己去定义个相应的才可以呢?
  回复  引用  查看    
#62楼 [楼主]2008-06-30 22:39 | 李永京      
@问题总是很多
这些都是.net3.5的新东东。
group by就是分组的意思,没有改变其类型,如果要换为别的类型可以使用select new{},不需要自定义,他只是搜索出来list,绑定到控件上就可以了。
  回复  引用    
#63楼 2008-06-30 22:55 | 问题总是很多 [未注册用户]
@李永京
但是一旦使用了group by ,调试就会出现错误提示
“System.Linq.IQueryable<System.Linq.IGrouping<int,SilverlightApplication1Web.Product>>”不包含“ToList”的定义,并且最佳扩展方法重载“System.Linq.Enumerable.ToList<TSource>(System.Collections.Generic.IEnumerable<TSource>)”的某些参数无效
比如linq这样写:
var products = from p in db.Products
group p by p.principal;
linq在linqpad里面测试能通过
  回复  引用  查看    
#64楼 [楼主]2008-06-30 23:18 | 李永京      
@问题总是很多
这是在sl项目中,单独使用linq时候就是那个意思哦。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-24 17:24 编辑过
 
另存  打印