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
库签名中使用可选参数。