Clingingboy

<clingingboy:control runat="server"  />
Get Ready For WPF && SilverLight

博客园 首页 新随笔 联系 订阅 管理
  173 Posts :: 1 Stories :: 1331 Comments :: 373 Trackbacks
       在家把E-Commerce的代码换成了linq版本的,代码量少了很多,看来做的工作越来越少,程序员的工资又要跌了...

代码不保证全部正确,只用于学习,需要的可以看看,运行环境当然是.net3.5了...

值得注意的是,当表关系不存在一对一或多对多的时候,你还是需要手动创建实体.

如购物车和产品两个表都有productid,你必须重新创建一个实体来获取两个表的数据

贴一小段代码

  private readonly static string connString = ConfigurationManager.ConnectionStrings["connectionstring"].ConnectionString;

    
private ECommerceDb db;

    
/// <summary>
    
/// 获取历史订单信息
    
/// </summary>
    
/// <param name="customerID"></param>
    
/// <returns></returns>

    public IQueryable<ESK_Orders> GetOrders(string customerID)
    
{
        db 
= new ECommerceDb(connString);
        var q 
=
        from o 
in db.ESK_Orders
        where o.CustomerID
==customerID orderby o.OrderDate descending
        select o;
        
return q;
    }


    
/// <summary>
    
/// 获取订单产品信息
    
/// </summary>
    
/// <param name="orderID"></param>
    
/// <returns></returns>

    public IQueryable GetOrderItems(int orderID)
    
{
        db 
= new ECommerceDb(connString);
        var q 
=
        from o 
in db.ESK_OrderDetails
        from p 
in db.ESK_Products
        where o.OrderID 
== orderID && o.ProductID==p.ProductID
        select 
new {o.Quantity,p.ProductName,o.ProductID,p.UnitCost };
        
return q;
    }


示例代码下载
posted on 2007-04-25 12:19 Clingingboy 阅读(3426) 评论(24)  编辑 收藏 网摘 所属分类: A Asp.net技术

Feedback

#1楼  2007-04-25 12:28 Will Yang      
对eCommerce有兴趣可以去找来Commercer Server 2007看看
  回复  引用  查看    

#2楼  2007-04-25 12:33 木野狐      
不错,学习。
  回复  引用  查看    

#3楼 [楼主] 2007-04-25 12:35 Clingingboy      
@Will Yang
听说要商业化了,不知道还开源不开源
  回复  引用  查看    

#4楼  2007-04-25 13:20 唉 [未注册用户]
看上去比SQL还难用!!!


  回复  引用    

#5楼  2007-04-25 13:20 .。。 [未注册用户]
微软在干什么???
  回复  引用    

#6楼  2007-04-25 14:18 Jeffrey Zhao      
@.。。
比Sql难用么?只是您不习惯而已吧,呵呵。
  回复  引用  查看    

#7楼  2007-04-25 15:04 iCaca      
好像vb的更易懂些

  回复  引用  查看    

#8楼 [楼主] 2007-04-25 15:15 Clingingboy      
写代码的人都是越写越懒的,会喜欢的
  回复  引用  查看    

#9楼  2007-04-25 16:15 木野狐      
绝对好的东西。

  回复  引用  查看    

#10楼  2007-04-25 17:21 Boler Guo      
这个C#代码高亮显示不支持C#3.0中的新特性,也应该升级了.

  回复  引用  查看    

#11楼  2007-04-25 20:38 ColdDog      
这样的做法将来维护起来方便吗?
好像是把sql代码和逻辑代码放一块去了~
  回复  引用  查看    

#12楼 [楼主] 2007-04-25 20:44 Clingingboy      
@ColdDog
这次修改几乎没改前台页面多少代码,最多换了一些实体类.

当然我只想做到只换接口,但一些用到了存储过程,所以一些内部逻辑的判断在所难免
  回复  引用  查看    

#13楼  2007-04-25 21:55 ColdDog      
@Clingingboy
噢,那我再问你一个困扰已久的问题阿~
比如数据库有两个表,Employee表(字段有:id,EmployeeName,DepartmentID),另一个表Department(字段有:DepartmentID和DepartmentName)。问题是,我该如何创建我的实体类EmployeeInfo和DepartmentInfo呢?
我一般的做法是EmployeeInfo中含ID,EmployeeName,DepartmentID三个属性;DepartmentInfo中含DepartmentID和DepartmentName两个属性。如果根据ID来Select一个Employee,SQL语句很简单:
SELECT t1.id,t1.EmployeeName,t2.DepartmentName
FROM Employee as t1 INNER JOIN Department as t2
ON t1.DepartmentID=t2.DepartmentID
WHERE t1.ID=@id

但问题来了,SELECT出来的结果,怎么赋给EmployeeInfo呢?因为EmployeeInfo并没有DepartmentName这个属性阿?
如果我在EmployeeInfo这个实体类中增加DepartmentName这个属性,那么从面向对象的角度考虑是否合适呢?
那你的做法呢?

我知道这是个很平常的例子,但我一直得不到正确的理解,以前一般是把DepartmentName也作为EmployeeInfo的一个属性的。

谢谢~
  回复  引用  查看    

#14楼 [楼主] 2007-04-25 22:09 Clingingboy      
@ColdDog

此问题我也问过我同事,也是说重新创建一个实体.
如果你创建了这个EmployeeInfo,问题就可以解决了,我以前也有此困惑.上面我也说过了,只能自己手动创建实体,这个是弊病.做法就跟你说的一样,重新创建一个对象把你需要的属性集合起来.否则的话难道把公共属性抽出来,然后再继承?
大家也可以讨论下,我也想得到好的解决方法
代码中有例子.转成List就可以了
/// <summary>
/// 获取购物车信息
/// </summary>
/// <param name="customerID"></param>
/// <returns></returns>
public List<ShoppingCartItem> GetItems(string customerID)
{
db = new ECommerceDb(connString);
var q =
from s in db.ESK_ShoppingCart
from p in db.ESK_Products
where s.CustomerID == customerID && s.ProductID == p.ProductID

select new ShoppingCartItem { Quantity = s.Quantity, ProductName = p.ProductName, ProductID = s.ProductID, UnitCost = p.UnitCost };
return q.ToList();
}
  回复  引用  查看    

#15楼  2007-04-25 22:28 U2U      
感觉一般,有点乱的感觉
  回复  引用  查看    

#16楼 [楼主] 2007-04-25 22:51 Clingingboy      
@U2U
还请提提意见:)
  回复  引用  查看    

#17楼  2007-04-26 08:20 ColdDog      
@Clingingboy
呵呵,我突然也觉得“把公共属性抽出来,然后再继承”这个做法比较可行~
像我刚才说的那个例子,可能只有一个属性(DepartmentName)需要多次出现,如果有多个表存在(比如学生表-课程表;学生表-班机表;……等),那肯定不可以把所有相关属性都并到EmployeeInfo中的。

所以,目前我支持“把公共属性抽出来,然后再继承”这个做法~
原因还有一点:我之前写过的一个ORM简单框架,也支持属性继承这样的做法,否则,对实体类的耦合度要求就太高了。

继续~
  回复  引用  查看    

#18楼  2007-05-05 08:00 徐鸿翼      
查询是面向集合的操作,这是数据库的强项,这个我认为还是进行小规模数据筛选用的@_@
  回复  引用  查看    

#19楼  2007-05-05 17:14 天梦      
谢谢 Clingingboy的代码,我学了好多东西,但是有点疑问
像程序中这类的代码
foreach (ESK_ShoppingCart shop in query)
        
{
            db.ESK_ShoppingCart.Remove(shop);
        }
 foreach (ESK_ShoppingCart shop in query)
        
{
            shop.Quantity 
= item.Quantity;
        }

        db.SubmitChanges();
使用foreach,如果数据量一大,在性能上不是会很慢?
 
 

  回复  引用  查看    

#20楼 [楼主] 2007-05-05 18:39 Clingingboy      
@天梦
我想如果直接写sql语句的话也是这么做法的,除非再定一个字段一条sql语句搞定,不然的话应该没什么区别吧.我也是照例子来做的:)
  回复  引用  查看    

#21楼  2007-05-08 17:32 天梦      
@Clingingboy
如下列代码
/// <summary>
/// 添加商品到购物车
/// </summary>
/// <param name="item"></param>
/// <returns></returns>

public void AddItem(ESK_ShoppingCart item)
{
db 
= new ECommerceDb(connString);
Table
<ESK_ShoppingCart> carts=db.ESK_ShoppingCart;
var query 
=
from shop 
in db.ESK_ShoppingCart
where shop.CustomerID 
== item.CustomerID && shop.ProductID == item.ProductID
select shop;
if (query.Count()<=0)
{
carts.Add(item);
}
 else
{
ESK_ShoppingCart cart2
= GetItem(item);
cart2.Quantity
++;
UpdateItem(cart2);
}

db.SubmitChanges();
}


我如何获取增加后的商品的ID号?

  回复  引用  查看    

#22楼  2007-05-08 17:44 天梦      
@Clingingboy
你有联系方式吗?想和你交流一下!我的Msn:ay68(a)msn.com

  回复  引用  查看    

#23楼 [楼主] 2007-05-08 17:47 Clingingboy      
zxh_zj@hotmail.com
  回复  引用  查看    

#24楼  2007-05-24 00:47 王琳 [未注册用户]
真的比较晕,难道不想让程序员活了
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: