sql设置表外键、linq简单查询

只包括一些简单的教程和查询,只是最基础并没有经过优化


设置数据库表主外键约束

lter table 外键表名 add constraint 约束名称 foreign key(外键字段)  references 主键表名(约束列名) 

如表A中的Ids是主键,要约束表B中的Aid列,那么语句应该是:

alter table B add constraint A_B_Ids foreign key(Aid)  references A(Ids) 

有外键添加数据时

有外键的情况应该先添加主表数据,再添加副表数据。

如:有以下两张表

班级表:

CLASSID  NAME

1               一班

2               二班

学生表:

SID     NAME    CLASSID 

1          张三           1

2          李四           1

3          王五           2

其中学生表中的CLASSID是班级表CLASSID的外键。

现在要求在学生表中添加一条SID=4,NAME=赵六,CLASSID=3的数据,那么只能先在班级表中加入一条新数据

1
insert  into  班级表  values  (3, '三班' );

然后再在学生表中添加:

1
insert  into  学生表  values  (4, '赵六' ,3);


Linq查询表达式是Linq中的非常重要的一部分内容,它可以从一个或多个给定的数据源中检索数据,并指定检索结果的数据类型和表现形式

在项目中用到了ef和linq来查询数据,并且将分页和多条件模糊查询整合一起 linq对给定数据源示例,

  1. Students.Where(s=>(s.id<10&&s.Name.Length<10)).OrderByDescending(o=>s.Name).Select(o=>new{o.id,o.Name})  

其中linq中具有or子句lambda表达式和空值返回的结果,

如果缺少orderby语句会报错


报错

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                        .Skip((page - 1) * pageSize)
                        .Take(pageSize)
                        .ToList();
修正

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                        .OrderBy(p => p.ProductSubcategoryID) // <---- this
                        .Skip((page - 1) * pageSize)
                        .Take(pageSize)
                        .ToList();

以上是我从stack看来得安静


linq模糊查询的时候使用了contains方法

ambda表达式Contains方法(等价于SQL语句中的like)使用注意事项:


1、使用Contains方法的必备条件:

Contains等价于SQL中的like语句。不过Contains只针对于字符串(string)类型的数据而言。如果是int等数值类型,则不会有Contains方法的存在,因此数值字段貌似无法通过使用Lambda表达式来完成like操作。因此在使用实体框架的同时,设计数据的时候如果想使用like请确保数据库字段为字符串类型(text、varchar等)

2、Contains方法关联方法(均等价于SQL中的like【注意:这里为什么会说是等价呢,因为如下列出的方法均为Stirng里的方法like的应用是不分字符类型的,数值行亦可】)

Contains等价于like '%key%' 指示指定的 String 对象是否出现在此字符串中。

EndsWith等价于like '%key' 确定此字符串实例的结尾是否与指定的字符串匹配。

StartsWith等价于like 'key%'  确定此字符串实例的开头是否与指定的字符串匹配。

3、使用Contains方法时前往不要忘记非NULL的判断:

数据库中如果存在值为NULL的值。

为什么会报错,看看如下的代码,想必大家也就知道其中的所以然了。

string str = null;

str.Contains("报错啦");//这里会报“未将对象引用设置到对象的实例。”错

因此不要忘记将代码

o.SearchKeyword.Contains("查询条件")

改写为:

o.SearchKeyword != null && o.SearchKeyword.Contains(("查询条件")


再使用linq获取回来list后要将list转换为JSON格式返回给客户端如果实体具有主外键关系如果直接使用

Newtonsoft.Json.JsonConvert.SerializeObject(orderLs).ToString();


会报错

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'CyberUser' with type 'DAL.CyberUser'. Path '[0].EventRegistrations[0].CyberUser.UserLogs[0]'.


JsonConvert.SerializeObject(ResultGroups, Formatting.None,
                        new JsonSerializerSettings()
                        { 
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                        });


忽略子级即可






猜你喜欢

转载自blog.csdn.net/weixin_38353287/article/details/80424106