为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心.

对EF开发来说,导航属性肯定都用过,事实上,它是由VS IDE工具根据你的数据库关系结构自动生成的外键属性,在类视图中可以看到相关属性,它是以外键表名来标识的,如果是一对多的关系,那么,它会为属性加上ICollection泛型集合用来标识,而今天我们要说的当然不是自动生成的,而是手动加的属性,这样属性需要我们手动进行join,然后把它按需赋值,而使用include当然是无效的,呵呵。

一般地,我们习惯上把集合属性定义为List<T>,但是,对于linq to entities来说,这个东西并不是很受欢迎,而标准结果集大家都知道是IEnumerable<T>,它是所有集合的基类,自身只提供了集合遍历的方法,这也是我们不用它作为导航属性的原因,因为我们一般需要为导航集合赋值的,而使用IEnumerable赋值就比较麻烦,需要借助List等集合。

引入IEnumerable的原因主要是List无法实现一个复杂的查询,如图:

这个查询返回一个派生类型,下面的复杂查询将会用到上面的结果,而这时,List类型的导航属性将是不被允许的

我们通过监视器可以看到,查询返回的默认是IEnumerable,所以,我们要属性改为IEnumerable,结果当然是正常的

而我们之前不用IEnumerable的原因,就是因为它的方法太单调了,没有添加,移除,查找等方法,而这时,不用它又不行,所以,只能把它进行扩展了,呵呵

扩展方法如下:

/// IEnumerable接口的扩展方法,支持它的实现类是List的情况 /// </summary> public static class IEnumerableExtensions /// <summary> /// 向集合中添加元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="value"></param> public static void Add<T>( this IEnumerable<T> collection, T value) (collection as List<T> ).Add(value); /// <summary> /// 从集合中删除元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="value"></param> public static void Remove<T>( this IEnumerable<T> collection, T value) (collection as List<T> ).Remove(value); /// <summary> /// 检索集合中是否包含某个元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="value"></param> /// <returns></returns> public static bool Contains<T>( this IEnumerable<T> collection, T value) return (collection as List<T> ).Contains(value); 为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心.对EF开发来说,导航属性肯定都用过,事实上,它是由VS IDE工具根据你的数据库关系结构自动生成的外键属性,在类视图中可以看到相关属性,它是以外键表名来标识的,如果是一对多的关系,那么,它会为属性加上ICollection泛型集合用来标识,而今天我们要说的当然不是自动生成的,而是手动加的属性,这样属性 也可以用个扩展方法: public static IEnumerable &lt;T&gt; Add&lt;T&gt;(this IEnumerable &lt;T&gt; e, T value) { for...
IEnumerator和 IEnumerable 的作用 其实IEnumerator和 IEnumerable 的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环,如果不清楚,请参考C# foreach循环较for循环的优势与劣势 代码如下: static void Main(string[] args) CatList cats = new ...
以前用.net写的东西,关于EF的坑因为不了解所以让我很难受,这算是把笔记搬过来了。 用EF的感觉我很喜欢,因为我确实更喜欢手写sql语句,Linq的语法更让我舒服,这就像是在用Java开发时我喜欢用mybatis而讨厌使用hibernate。 IEnumerable 和IQueryable 因为从在看一本老外写的c# .net mvc5的书的时候,我当时关注的是项目整体的设计过程和模式,没有关注EF这个玩意,它的栗子是这么写的: public class EFDbContext : DbCon
var dtDy = (from d in dtDytemp select new {d.Id ,d.dymc }).ToList() ; dtDy.Add(new {Id = 1, dymc = "公共会员"}); IEnumerable 中没有Add方法,只能ToList后才能增加 转载于:https://www.cnblogs.com/xjt3...
前言:在前面的博客中我们讲到了数组http://www.cnblogs.com/MoRanQianXiao/p/7825013.html。数组的大小是固定的。如果元素的个数是动态的。就应使用集合类。 一:集合 接口 和类型                                                   List<T>是与数组相当的集合类。还有其他... //既然不能修改,那么在类内部怎么办呢? 类内部使用集合 //让属性的 get方法 返回该集合; private List<InvenceData> listRead = new List<InvenceData>(); http://msdn2.microsoft.com/zh-cn/library/6tc79sx1(VS.80).aspx 以及相关的章节,如 常用的集合类型 http://msdn2.microsoft.com/zh-cn/library/0ytkdh4s(VS.80).aspx 何时使用泛型集合 http://msdn2.microsoft.com/...
咋一看到 IEnumerable 这个 接口 ,我们可能会觉得很神奇,在一般的编程时,基本上我们是想不到去用它的,可是,俗话说得好,存在便是道理,那么,它对我们来说,能够带来哪些奇妙的事情呢? 要想弄懂它,我们还是看看其定义吧! 在MSDN上,是这么说的,它是一个公开枚举数,该枚举数支持在非泛型集合上进行简单的迭代。换句话说,对于所有数组的遍历,都来自 IEnumerable ,...
在使用List之前,首先需要创建一个List对象,和创建其他类型的对象一样,通过new关键字类创建List对象,但是在创建时要明确指定参数类型T的实际类型,创建之后该对象只能包含指定类型(及其子类型)的元素。 如下面的代码所示,intLst是通过new关键字创建的List类型对象,它只能包含int类型的元素,为它 添加 非int类型元素是不合法的。同样地,strLst只能包含string类型的元
创建一个基本的.net core API项目并实现 增删 可以按照以下步骤进行: 1. 打开Visual Studio 2019,点击"Create a new project",选择.NET Core > ASP.NET Core Web Application,并在下拉框中选择API,然后点击"Create"按钮。 2. 在新建项目的对话框中,填写项目名称和存储路径,然后点击"Create"按钮。 3. 在创建的项目中,打开Startup.cs文件,在ConfigureServices方法中 添加 如下代码,以启用EFCore: services.AddDbContext<YourDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 4. 在Configure方法中 添加 以下代码来启用MVC: app.UseMvc(); 5. 在项目中 添加 实体类,例如: public class Product public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } 6. 在项目中 添加 DbContext类,例如: public class YourDbContext : DbContext public YourDbContext(DbContextOptions<YourDbContext> options) : base(options) public DbSet<Product> Products { get; set; } 7. 添加 控制器类,例如: [Route("api/[controller]")] [ApiController] public class ProductsController : ControllerBase private readonly YourDbContext _context; public ProductsController(YourDbContext context) _context = context; // GET: api/Products [HttpGet] public async Task<ActionResult< IEnumerable <Product>>> GetProducts() return await _context.Products.ToListAsync(); // GET: api/Products/5 [HttpGet("{id}")] public async Task<ActionResult<Product>> GetProduct(int id) var product = await _context.Products.FindAsync(id); if (product == null) return NotFound(); return product; // POST: api/Products [HttpPost] public async Task<ActionResult<Product>> PostProduct(Product product) _context.Products.Add(product); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); // PUT: api/Products/5 [HttpPut("{id}")] public async Task<IActionResult> PutProduct(int id, Product product) if (id != product.Id) return BadRequest(); _context.Entry(product).State = EntityState.Modified; await _context.SaveChangesAsync(); return NoContent(); // DELETE: api/Products/5 [HttpDelete("{id}")] public async Task<IActionResult> DeleteProduct(int id) var product = await _context.Products.FindAsync(id); if (product == null) return NotFound(); _context.Products.Remove(product); await _context.SaveChangesAsync(); return NoContent(); 这样,你就可以在控制器类中实现基本的 增删 操作 。注意,这里只是一个简单的示例,你可以根据实际需求来修改和完善代码。