Tag: linq to sql

C#LINQ to SQL:重构此通用GetByID方法

我写了以下方法。 public T GetByID(int id) { var dbcontext = DB; var table = dbcontext.GetTable(); return table.ToList().SingleOrDefault(e => Convert.ToInt16(e.GetType().GetProperties().First().GetValue(e, null)) == id); } 基本上它是Generic类中的一个方法,其中T是DataContext中的一个类。 该方法从T( GetTable )的类型获取表,并检查输入参数的第一个属性(始终是ID)。 这个问题是我必须首先将元素表转换为列表以在属性上执行GetType ,但这不是很方便,因为必须枚举表的所有元素并将其转换为List 。 如何重构此方法以避免整个表上的ToList ? [更新] 我无法直接在表上执行Where的原因是因为我收到此exception: 方法’System.Reflection.PropertyInfo [] GetProperties()’没有支持的SQL转换。 因为GetProperties无法转换为SQL。 [更新] 有人建议使用T的接口,但问题是T参数将是[DataContextName] .designer.cs中自动生成的类,因此我无法使其实现接口(并且它不可行实现LINQ的所有这些“数据库类”的接口;并且,一旦我将新表添加到DataContext,该文件将被重新生成,从而丢失所有写入的数据)。 所以,必须有一个更好的方法来做到这一点…… [更新] 我现在已经按照Neil Williams的建议实现了我的代码,但我仍然遇到问题。 以下是代码的摘录: 接口: public interface IHasID { int ID { get; set; […]

使实体类关闭以进行更改

我有一个数据库关系,如下所示。 域对象是基于LINQ to SQL ORM创建的。 付款包括现金付款和礼品券付款。 假设购买总额为550.可以按以下组件支付 1 Gift Coupon Valued 300 1 Gift Coupon Valued 200 I Cash Currency Valued 50 我正在使用ORM的“InsertOnSubmit”function插入新的付款记录。 以下代码工作正常。 但是,如果我公司使用信用卡引入新的支付组件,我需要更改我的“付款”域类。 如何使支付类打开以进行扩展并关闭仍在使用ORM的 更改 ? 注意:Payment类具有行为 (例如GetTotalAmountCollected)。 我正在努力使“付款”类满足OCP。 注意:优惠券类型有特定的行为 。 优惠券发行日期是否小于2000年1月1日,不应用于计算总金额(即,CouponValue应为零)。 请参阅使用策略模式重构代码 。 注意:我使用的是.Net 4.0 参考: 将ObjectContext.AddObject与Entity Framework一起使用时出错 使用策略模式重构代码 喜欢构成而不是inheritance? 代码优先与模型/数据库优先 使用Unity的策略模式和dependency injection 委托与OOP的C#策略设计模式 如何在C#中使用策略模式? EF代码优先inheritance:第2部分 – 每种类型的表(TPT) http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first -ctp5部分-2-表每类型tpt.aspx C#代码: public […]