C# 查询对象作为后端查询的参数
我正在从事一个图书馆项目,该项目目前正在从不同的来源返回数据(目前使用实体框架,但将来会更多) 我创建了一些简单的方法,如:C# 查询对象作为后端查询的参数,c#,C#,我正在从事一个图书馆项目,该项目目前正在从不同的来源返回数据(目前使用实体框架,但将来会更多) 我创建了一些简单的方法,如: public TransactionHistory GetTransactions(DateTime? dateFrom = null, DateTime? dateTo = null, TransactionTypes[] transactionTypes = null) 当参数的数量开始增长时,我自然想到创建一个查询模型类,并在方法参数中使用它,而不是使用字段作为参
public TransactionHistory GetTransactions(DateTime? dateFrom = null, DateTime? dateTo = null, TransactionTypes[] transactionTypes = null)
当参数的数量开始增长时,我自然想到创建一个查询模型类,并在方法参数中使用它,而不是使用字段作为参数
public class TransactionHistoryQuery
{
public DateTime? dateFrom {get; set;}
public DateTime? dateTo {get; set;}
public TransactionTypes[] transactionTypes {get; set;}
}
我的方法是:
public TransactionHistory GetTransactions(TransactionHistoryQuery query)
但在各种情况下,我必须在后端使用大于和小于运算符进行查询(其中dateFrom>[dateValue])
我想到的第一件事是使用如下查询模型:
public class TransactionHistoryQuery
{
public DateTime? dateFromEquals {get; set;}
public DateTime? dateFromGreaterThan {get; set;}
public DateTime? dateFromLessThan {get; set;}
public DateTime? dateToEquals {get; set;}
public DateTime? dateToGreaterThan {get; set;}
public DateTime? dateToLessThan {get; set;}
...
}
第二个想法是使用IQueryable,但我认为从IQueryable到IQueryable的映射不起作用
有人能提出更好的方法吗
谢谢我只会使用
DateFrom
和DateTo
属性。使查询
对象尽可能简单,并将大于/小于/等于/等的逻辑推入查询本身
// define classes
public class Transaction
{
public DateTime TransactionDate { get; set; }
public string Name { get; set; }
}
public class TransactionHistoryQuery
{
public DateTime? DateFrom { get; set; } = null;
public DateTime? DateTo { get; set; } = null;
public string Name { get; set; } = null;
}
// prep test data
IList<Transaction> transactions = new List<Transaction>();
transactions.Add(new Transaction() { Name = "T1",TransactionDate = new DateTime(2010,10,19)});
transactions.Add(new Transaction() { Name = "T2", TransactionDate = new DateTime(2015, 5, 13) });
transactions.Add(new Transaction() { Name = "T3", TransactionDate = new DateTime(2018, 12, 3) });
// prepare query
TransactionHistoryQuery q = new TransactionHistoryQuery();
q.DateFrom = new DateTime(2017,1,1);
q.Name = "T";
// perform query and 'ignore' the null values in your query logic using conditions with parenthesis
var result =
transactions.Where(t => (
(t.TransactionDate >= q.DateFrom && t.TransactionDate <= q.DateTo) ||
(t.TransactionDate >= q.DateFrom && q.DateTo == null) ||
(q.DateFrom == null && t.TransactionDate <= q.DateTo)) &&
(t.Name.Contains((q.Name ?? string.Empty)) || q.Name == null)
).ToList();
// results = { Name = "T3", TransactionDate = new DateTime(2018, 12, 3) }
//定义类
公共类事务
{
公共日期时间事务日期{get;set;}
公共字符串名称{get;set;}
}
公共类TransactionHistoryQuery
{
public DateTime?DateFrom{get;set;}=null;
public DateTime?DateTo{get;set;}=null;
公共字符串名称{get;set;}=null;
}
//准备测试数据
IList事务=新列表();
添加(newtransaction(){Name=“T1”,TransactionDate=newdatetime(2010,10,19)});
添加(new Transaction(){Name=“T2”,TransactionDate=new DateTime(2015,5,13)});
添加(new Transaction(){Name=“T3”,TransactionDate=new DateTime(2018,12,3)});
//准备查询
TransactionHistoryQuery q=新建TransactionHistoryQuery();
q、 DateFrom=新的日期时间(2017,1,1);
q、 Name=“T”;
//使用带括号的条件执行查询并“忽略”查询逻辑中的空值
var结果=
事务。其中(t=>(
(t.TransactionDate>=q.DateFrom&&t.TransactionDate=q.DateFrom&&q.DateTo==null)||
(q.DateFrom==null&&t.TransactionDate顺便说一句,对public
库方法使用带有默认值的可选参数被认为是一种不好的做法。使用默认值设置为null
的可选参数,以便我可以在后端应用条件查询。例如DateFrom
字段的where语句只有在后端存储库具有某些值时,才会将其应用于后端存储库。请阅读此静态代码分析,了解为什么不应在public
库签名中使用可选参数。