为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
<T> Add<T>(this
IEnumerable
<T> 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();
这样,你就可以在控制器类中实现基本的
增删
改
查
操作
。注意,这里只是一个简单的示例,你可以根据实际需求来修改和完善代码。